我有一个集合
{
"_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]
是内容。
和几个变种,但我不能让它工作。我错过了什么?
答案 0 :(得分:1)
根据你的评论,你应该担心。我已经看过几次特别是PHP应用程序(并且PHP在转储数组中有这种有趣的表示法)。
问题是诸如“0”和“1”之类的元素本身创建了子文档,而不是仅将该结构下的所有内容作为子文档本身作为数组成员,然后运行因为使用的路径需要是“绝对的”,所以访问数组的各个成员的问题。
所以这实际上“强迫”没有其他可能的选项来通过等效的“点符号”形式访问元素。除了在这种情况下,它不仅仅是数组的“第n”元素,而是您需要解决的实际路径。
但如果这确实对你有用,那看起来似乎“有人”试图避免
“嵌套”数组下位置更新的问题(有关详细信息,请参阅positional $
运算符文档),然后您可以像这样执行更新:
基本陈述如下:
db.collection.update(
{
"data.0.context": 2
},
{
"$pull": { "data.$.0.context": 2 }
}
)
这似乎是一种有趣的方式来写这个,但是在调查你的实际结构时,你应该能够看到为什么需要它的原因。本质上,这符合使用位置$
运算符来指示数组中第一个匹配元素的索引(也称为“数据”)的要求,然后使用标准子文档表示法来指定路径要更新的元素。
因此,如果元素实际上处于未知位置,这当然会产生问题。但是要考虑的是,考虑到记录的限制,阵列的哪些用途对您来说实际上很重要?如果你需要匹配“inner”元素的位置,那么改变结构以将数组放在那里。
但始终要了解限制的影响,并尝试根据引擎的实际情况进行建模。