簡體   English   中英

MongoDB為什么出現此錯誤:無法使用字符串字段名稱附加到數組:注釋

[英]MongoDB Why this error : can't append to array using string field name: comments

我有一個如下的數據庫結構:

{
    "_id" : 1,
    "comments" : [
        {
            "_id" : 2,
            "content" : "xxx"
        }
    ]
}

我在評論區更新了一個新的子文檔。 沒關系。

db.test.update(
               {"_id" : 1, "comments._id" : 2},
               {$push : {"comments.$.comments" : {_id : 3, content:"xxx"}}}
)

之后的數據庫結構:

{
    "_id" : 1,
    "comments" : [
        {
            "_id" : 2,
                    "comments" : [
                            {
                                    "id" : 3,
                                    "content" : "xxx"
                            }
                    ],
            "content" : "xxx"
        }
    ]
}

但是,當我在_id為3的注釋字段中更新新的子文檔時,出現錯誤:

db.test.update(  
               {"_id" : 1, "comments.comments.id" : 3},   
               {$push : {"comments.comments.$.comments" : {id : 4, content:"xxx"}}}  
)

錯誤信息:

無法使用字符串字段名稱追加到數組:注釋

好吧,如果您考慮一下,這是完全有意義的。 MongoDb具有神奇地解決某些問題的優點和缺點。 當您在數據庫中查詢特定的常規字段時,如下所示:

{ field : "value" }

查詢{field:“ value”}很有道理,如果value是數組的一部分,則不會有問題,但是Mongo會為您解決它,因此,如果結構為:

{ field : ["value", "anothervalue"] }

Mongo遍歷所有這些對象,然后將“值”匹配到該字段中,而您不必考慮它。 它完美地工作了..僅在一個級別上,因為如果您有多個級別,就無法猜測您想做什么

在您的情況下,第一個查詢有效,因為在此示例中是這樣的:

db.test.update(
               {"_id" : 1, "comments._id" : 2},
               {$push : {"comments.$.comments" : {_id : 3, content:"xxx"}}}
)

匹配第一級的_id和第二級的comment._id,結果得到一個數組,但是Mongo可以解決它。

但是在第二種情況下,請考慮您的需求,讓我們隔離where子句:

{"_id" : 1, "comments.comments.id" : 3},

“用_id:1從主集合記錄中給我”(一個文檔)“以及內部注釋中具有id = 3的注釋”(數組*數組)

第一層很容易解決,comments.id,第二層不可能,因為注釋返回一個數組,但是另一層是數組的數組,因此Mongo獲得了數組的數組,因此無法將文檔壓入數組的所有記錄。

解決方案是縮小您的where子句以在注釋中獲得唯一的文檔(可能是第一個),但這不是一個好的解決方案,因為您永遠無法使用我認為的shell知道要查找的文檔的位置。唯一准確的選擇是分兩個步驟進行。 檢查此查詢是否有效(無論如何都不是解決方案),但是“解決”將其固定到第一條記錄的多數組部分:

db.test.update(
    {"_id" : 1, "comments.0.comments._id" : 3},
        {$push : {"comments.0.comments.$.comments" : {id : 4, content:"xxx"}}}   
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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