比方說,我有一個這樣的文件:MongoDB的UPSERT在子文檔中數組並返回更新的子文檔
{
"_id" : ObjectId(1234),
"name": "foo",
"bars": [
{ "name": "n1", "myBool": true },
{ "name": "n2", "myBool": false },
{ "name": "n3", "myBool": false }
]
}
我想找到name
(或整個子文檔,它並不真正的問題),並且針對bars
中的第一個子文檔改變爲true
,對於在原子操作中的給定_id
,當前爲false
。例如,對於上面的數據,我想在_id
等於ObjectId(1234)
的文檔中返回n2
並將其設置爲myBool
至true
對於n2
。
我該如何做到這一點?
是否可以調整,以僅返回子文檔而不是整個文件?即我想知道哪個子文檔(名稱)已更改。 – Johan
不幸的是,你不能在原子更新中做到這一點。您必須手動過濾數組,即運行兩個單獨的查詢1.使用'_id「查找文檔:1234, 」bars.myBool「:false }'然後運行上述更新,它將返回修改過的文檔。當你得到這兩個文檔時,你可以在'bars'數組子文檔中找到差異。 – chridam
不幸的是,這不會在高度併發的環境中工作,因爲兩個或多個線程可以同時執行此操作。即我不能先讀取,然後比較結果,因爲另一個線程可能已經更新了「myBool」,然後我不知道哪一個被更改了。 – Johan