查询从嵌套在对象中的数组中获取元素并不是什么大问题。但是,当你有一个嵌入其自身的自重复结构时,它似乎变得更加复杂。这是一个示例文档:
{
"_id": "1",
"name": "Alpha",
"options": [
{
"_id": "2",
"name": "Bravo",
"options": [
]
},
{
"_id": "3",
"name": "Charlie",
"options": [
{
"_id": "4",
"name": "Delta",
"options": [
...etc
]
}
]
}
]
}
正如您所看到的,这里我们有许多数组保存相似的对象。例如,这对于从DB配置的选项卡式界面非常有用。
我想要做的事实上是能够修改结构中更深层的文档而不知道它们在祖先数组中的位置。到目前为止,我只发现了" $"当您不必处理多个级别的阵列时,更新运算符会很有帮助。但正如您所看到的,对象内部的数组位于数组内部,因此变得复杂。
在第一级推送数组并不困难:
db.myCollection.update({_id: "1", "options._id": "2"}, {$push: {"options.$.options": {...object definition here...}}});
这很有效。但是,当您尝试深入了解结构时,我并不了解如何定位文档的更深层部分。
以下查询对我不起作用,我希望有人可以帮助我:
db.myCollection.update({_id: "1", "options.options._id": "4"}, {"options.options.$.options": {...object definition here...}});
它引发了我如何使用点语法。这是有道理的,因为在这种情况下" options.options"很暧昧。我希望查询选择指向正确的位置。
tl; dr:如何更新多个级别的文档部分,这些部分深层嵌套在多个不知道目标元素索引的数组中?您可以选择它,因此您应该能够对其进行修改。