簡體   English   中英

MongoDB-從對象數組中拉出

[英]MongoDB - Pull from array of objects

我有一個收藏

{
    "_id" : ObjectId("534bae30bf5049a522e502fe"),
    "data" : [
            {
                    "0" : {
                            "content" : "1",
                            "type" : "text",
                            "ident" : true
                    },
                    "1" : {
                            "content" : "",
                            "type" : "text",
                            "ident" : false
                    }

            },
            {
                    "0" : {
                            "content" : "2",
                            "type" : "text",
                            "ident" : true
                    },
                    "1" : {
                            "content" : "",
                            "type" : "text"
                    }
            }
    ]

}

content是獨一無二的。

我將如何刪除與content: '2'匹配的對象?

我已經試過了:

data:{$pull:{"content": deletions[i]}}

其中deletions [i]是內容。

和幾種變體,但我無法使其正常工作。 我想念什么?

根據您的評論,您應該擔心。 我已經多次見過這種情況,特別是在PHP應用程序中(PHP在轉儲數組中有這種有趣的表示法)。

問題是諸如“ 0”和“ 1”之類的元素本身會創建子文檔,而不是僅將該結構下的所有內容保留為子文檔本身作為數組成員,然后您就會遇到問題訪問數組的單個成員,因為使用的路徑需要是“絕對的”。

因此,這實際上不會“迫使”其他等效的“點表示法”形式來訪問元素。 除了在這種情況下,它不僅是數組的“第n個”元素,而且是您需要解決的實際路徑。

但是,如果這確實對您有用,並且似乎“某人”正試圖避免“嵌套”數組下的位置更新出現問題(有關詳細信息,請參見位置$運算符文檔),那么可以按以下方式執行更新:

基本聲明如下:

db.collection.update(
    {
        "data.0.context": 2
    },
    {
        "$pull": { "data.$.0.context": 2 }
    }
)

這樣做確實看起來有點“有趣”,但是在研究實際結構時,您應該能夠知道為什么需要這樣做。 從本質上講,這符合使用位置$運算符指示數組中第一個匹配元素的索引(也稱為“數據”)的要求,然后使用標准子文檔表示法來指定要更新的元素的路徑的要求。

因此,如果元素實際上處於未知位置,這當然會帶來問題。 但是要考慮的是,鑒於記錄的限制,數組的哪種用法實際上對您來說很重要? 如果您需要匹配“內部”元素的位置,請更改結構以將數組放在其中。

但是,請務必了解限制的影響,並嘗試根據引擎的實際功能進行建模。

暫無
暫無

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

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