也许这是一个很受欢迎的问题,但我找不到我的解决方案。 我有一个包含如下元素的集合:
_id: ObjectId("52821d6c21c495b30a000015")
structure: {
elements: [{
id: "non-unique-id1",
other_data: "value"
subs: [{
id: 1,
field1: "somevalue",
field2: "other value"
}, {
id: 2,
field1: "somevalue",
field2: "other value"
}, {
id: 3,
field1: "somevalue",
field2: "other value"
}]
}, {
id: "non-unique-id2",
subs: [{
id: 1,
field1: "somevalue",
field2: "other value"
}, {
id: 2,
field1: "somevalue",
field2: "other value"
}, {
id: 3,
field1: "somevalue",
field2: "other value"
}]
}]
}
现在我想从sub子阵列中删除一个元素,因为它是id。我希望删除发生在所有element
字段上。
我尝试了以下内容,但即使我没有收到错误,也没有任何反应:
db.objects.update({
"_id" : ObjectId("52821d6c21c495b30a000015")
},{
$pull: {
"structure.elements.subs": {id: 2}
}
})
这应该已经使用id: 2
尝试了$pullAll
,但我收到了错误:
Modifier $pushAll/pullAll allowed for arrays only
关于如何实现目标的任何想法?
答案 0 :(得分:2)
Mongo对更新嵌套数组的支持非常弱。您必须在elements
:
$pull
数组元素
db.objects.update({
"_id" : ObjectId("52821d6c21c495b30a000015")
},{
$pull: {
"structure.elements.0.subs": {id: 2},
"structure.elements.1.subs": {id: 2}
}
})
答案 1 :(得分:1)
您可以使用$,但查询只会删除1个潜艇,对于您的示例的两个潜艇,您必须运行两次更新。您需要编写一个脚本来迭代您的文档。
db.objects.update({
"_id" : ObjectId("52821d6c21c495b30a000015"),
"structure.elements.subs.id": 2
},{
$pull: {
"structure.elements.$.subs": {"id": 2}
}
});
如果您需要进行临时管理操作,则可以,但对于应用程序性能太差
抱歉我的英语不好:)