Mongo使用$运算符更新数组子元素用于多个条件

时间:2018-03-29 10:34:10

标签: mongodb

我的mongo系列中有以下数据:

{
    "services" : [ 
        {
            "service" : "service1",
            "instanceId" : 0,
            "attributes" : {
                "attr" : {
                    "value" : "val1"
                }
            }
        }, 
        {
            "service" : "service1",
            "instanceId" : 1,
            "attributes" : {
                "attr" : {
                    "value" : "val2"
                }
            }
        }, 

    ]
}

我正在尝试使用$ operator:

运行以下查询以更新instanceid 1的数据
db.device.update({"services.service":"service1", "services.instanceId":1},{"$set":{"services.$.attributes.attr.value":"val3"}},{})

但是这个查询总是更新数组的实例id 0。我无法找到任何其他方式来更新它。

2 个答案:

答案 0 :(得分:2)

使用$elemMatch来定位在多个条件下匹配的数组元素。

这样的东西
db.device.update(
  {"services":{"$elemMatch":{"service":"service1", "instanceId":1}}},
  {"$set":{"services.$.attributes.attr.value":"val3"}}
)

答案 1 :(得分:0)

<强>更新

试试这个:

db.runCommand({
   update:"sample", //provide collection name here
   updates:[{q:{}, u:{$set:
    {"services.$[element].attributes.attr.value":"val3"}}, arrayFilters: [ { 
     "element.instanceId": 1, "element.service": "service1" } ], multi:true}]  
 })

或者这个:

db.sample.update(
 {},
 {$set:{"services.$[element].attributes.attr.value":"val3"}},
 {arrayFilters: [ { "element.instanceId": 1, "element.service": "service1" } 
 ], multi:true}

)

enter image description here enter image description here

感谢@mickl的评论和信息。