[英]Using MongoDB, how do I update a sub-document of a sub-array when element position is unknown?
我正在嘗試更新子數組的子文檔,但是我不能指望元素在數組中的位置始終保持相同,因此如何更新它。
例如,這是我的文檔,我只想將另一個標簽對象(鍵/值)推到real_pagenum
的tags
數組上:pdf的_id
為ObjectId("50634e26dc7c22c64d00000a")
{
"_id" : ObjectId("503b83dfad79cc8d26000004"),
"pdfs" : [
{
"_id" : ObjectId("50634e26dc7c22c64d00000a"),
"pages" : [
{
"real_pagenum" : 1,
"_id" : ObjectId("50634e74dc7c22c64d00002b"),
"tags" : [
{
"key" : "Item",
"val" : "foo"
},
{
"key" : "Item",
"val" : "bar"
}
]
},
{
"real_pagenum" : 2,
"_id" : ObjectId("50634e74dc7c22c64d00002b")
}
],
"title" : "PDF3",
"version" : 3
}
],
}
重申一下,目標是首先通過_id
定位正確的pdf,然后通過real_pagenum
正確的頁面,並將其推入該pdf頁面的tags
數組。
我試過了:
db.projects.update({'pdfs.pdf_id':ObjectId("50634e25dc7c22c64d000007")},
{$push:{'pages.$.tags':{'key':'foo','val':'bar'}}},false,false);
但這達不到我需要的水平。 我已經讀過我可以將位置運算符與實際元素position結合使用,但是同樣,我不能保證或知道元素的位置。
目前這是不可能的。 您只能使用位置運算符尋址文檔樹中的最高級別的數組。 如果您知道確切的元素位置,則只能訪問任何更深的數組。
當前這是一個未解決的問題: https : //jira.mongodb.org/browse/SERVER-831
mongodb中當前存在的一個錯誤是位置運算符不能用於嵌套數組:
https://jira.mongodb.org/browse/SERVER-831
暫時不能在一個查詢中多次使用位置運算符。
解決您的情況的最佳方法可能是更改架構。 通常,在文檔中具有將增長為任意大小的數組不是一個好主意,因為BSON文檔的最大大小為16mb。
特別是因為在這種情況下,您的文檔似乎基本上只是pdf數組。 您是否考慮過為pdf創建單獨的集合?
至於對文檔進行原子更新,其他答案是正確的。
我非常同意這看起來似乎不是最佳方案-每個pdf文檔可能更有意義,然后每個文檔中只有一個頁面數組,您可以使用位置運算符自動更新頁面。
如果您無法修改架構,則仍然可以進行所需的更新,盡管它可能不是線程安全的。 您可以將整個文檔讀入應用程序,在代碼中修改適當的字段,然后保存該項目。 如果您要確保多個線程不會相互重疊,則必須在每個文檔中保留一個版本,並在每次“更新”時對其進行遞增,這要以同時未更改該版本為條件。 它更復雜,並且在當前模式中仍然需要一個附加字段,但是至少它允許您執行需要執行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.