MongoDB - 从对象数组中拉出

时间:2014-04-14 09:53:57

标签: arrays mongodb

我有一个集合

{
    "_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]是内容。

和几个变种,但我不能让它工作。我错过了什么?

1 个答案:

答案 0 :(得分:1)

根据你的评论,你应该担心。我已经看过几次特别是PHP应用程序(并且PHP在转储数组中有这种有趣的表示法)。

问题是诸如“0”和“1”之类的元素本身创建了子文档,而不是仅将该结构下的所有内容作为子文档本身作为数组成员,然后运行因为使用的路径需要是“绝对的”,所以访问数组的各个成员的问题。

所以这实际上“强迫”没有其他可能的选项来通过等效的“点符号”形式访问元素。除了在这种情况下,它不仅仅是数组的“第n”元素,而是您需要解决的实际路径。

但如果这确实对你有用,那看起来似乎“有人”试图避免 “嵌套”数组下位置更新的问题(有关详细信息,请参阅positional $运算符文档),然后您可以像这样执行更新:

基本陈述如下:

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

这似乎是一种有趣的方式来写这个,但是在调查你的实际结构时,你应该能够看到为什么需要它的原因。本质上,这符合使用位置$运算符来指示数组中第一个匹配元素的索引(也称为“数据”)的要求,然后使用标准子文档表示法来指定路径要更新的元素。

因此,如果元素实际上处于未知位置,这当然会产生问题。但是要考虑的是,考虑到记录的限制,阵列的哪些用途对您来说实际上很重要?如果你需要匹配“inner”元素的位置,那么改变结构以将数组放在那里。

但始终要了解限制的影响,并尝试根据引擎的实际情况进行建模。