簡體   English   中英

使用MongoDB,當元素位置未知時,如何更新子數組的子文檔?

[英]Using MongoDB, how do I update a sub-document of a sub-array when element position is unknown?

我正在嘗試更新子數組的子文檔,但是我不能指望元素在數組中的位置始終保持相同,因此如何更新它。

例如,這是我的文檔,我只想將另一個標簽對象(鍵/值)推到real_pagenumtags數組上:pdf的_idObjectId("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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM