将属性添加到mongo数组中的一个元素(基于该数组项的另一个属性)

时间:2014-01-16 18:18:53

标签: mongodb

我有一系列遵循这种结构的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"}?有没有办法捕获数组项的索引值,或更好的方法来处理它?

2 个答案:

答案 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" } ]
    })