我在MongoDB中有以下文檔。MongoDB數組 - 原子更新或推送元素
{
"_id" : ObjectId("521aff65e4b06121b688fabc"),
"user" : "abc",
"servers" : [
{
"name" : "server1",
"cpu" : 4,
"memory" : 4
},
{
"name" : "server2",
"cpu" : 6,
"memory" : 6
},
{
"name" : "server3",
"cpu" : 8,
"memory" : 8
}
]
}
基於某些事件,我必須要麼更新現有服務器的CPU和內存字段或添加新的服務器陣列,如果它不數組中存在。目前,我正在分兩步執行此操作。首先檢查服務器是否已經存在於陣列中。如果是,請更新cpu和內存字段。否則,在陣列中推入一個新的子文檔。由於應用程序的多線程性質,有時會將相同的服務器多次添加到陣列。是否有任何的原子操作者執行以下兩個操作(類似於$setOnInsert
操作者):
- 如果陣列中存在元素,更新其字段。
- 如果元素不存在於數組中,則推新元素。
注意:運算符$addToSet
在上述情況下不起作用,因爲cpu或內存的值可能不同。
謝謝。我已經做了類似於你的建議。現在,應用程序確保相同服務器的兩個更新由相同的線程處理。 –
如果您的多實例部署是常見情況,這並不能解決問題。 – alexey