我有一系列遵循这种结构的mongoDB文档:
{
"_id": "myId",
"myArray": [
{"foo": "bar"},
{"foo": "baz"}
]
}
另一个可能看起来像这样:
{
"_id": "myOtherId",
"myArray": [
{"foo": "bar"},
{"foo": "baz"}
]
}
我需要在foo = bar的任何数组元素中添加一个属性,只有当id = myOtherId ...换句话说,所以我的第二个文档看起来像这样(但第一个文件赢了&t; t更新):
{
"_id": "myOtherId",
"myArray": [
{"foo": "bar","foot":"bart"},
{"foo": "baz"}
]
}
我知道我的更新的第一个参数是这样的:
db.coll.update({$and:[{"_id":"myOtherId"},{"myArray.foo":"bar"}]}, // but what comes in the $set?
然后我如何撰写$set
参数,以便只在我需要的地方添加{"$foot":"bart"}
?有没有办法捕获数组项的索引值,或更好的方法来处理它?
答案 0 :(得分:2)
在这种情况下,您不需要使用$and
,因为查询对象中的多个术语之间始终存在隐式AND。您还可以使用$
中的$set
位置更新运算符来识别查询中匹配的myArray
元素以进行更新:
db.coll.update(
{_id: "myOtherId", "myArray.foo": "bar"},
{$set: {"myArray.$.$foot": "bart"}})
答案 1 :(得分:0)
以@JohnnyHK的答案为基础。
如果数组myArray
中包含多个元素,且{"foo": "bar"}
{
"_id": "myOtherId",
"myArray": [
{"foo": "bar"},
{"foo": "baz"},
{"foo": "bar"}
]
}
并且必须匹配所有匹配的元素,然后我们需要在更新命令中使用arrayFilters。
db.coll.update(
{_id: "myOtherId", "myArray.foo": "bar"},
{$set: {"myArray.$[elem].foot": "bart"}},
{
multi: true,
arrayFilters: [ { "elem.foo": "bar" } ]
})