Mongodb更新多嵌套数组中的对象

时间:2016-07-12 16:27:24

标签: arrays mongodb nested

我在mongodb中有一个文档,有两层深层嵌套的对象数组,我需要更新,就像这样。

{
  "id":12362,
  "onGoing":[
    {
      "id":14597,
      "offers":[
        {
          "id":56897,
          "status":"validated"
        },
        {
          "id":86127,
          "status":"validated"
        }
      ]
    },
    {
      "id":89451,
      "offers":[
        {
          "id":12235,
          "status":"validated"
        },
        {
          "id":56457,
          "status":"validated"
        }
      ]
    }
  ]
}

我想更新与其ID匹配的所有优惠。

我尝试更新

db.repairJobs.update({
  "onGoing.offers":{
    $elemMatch:{
      _id:{
        $in:[
          '56897', '56457'
        ]
      }
    }
  }
},
{
  $set:{
    "ongoing.offers.$.status":"ACCEPTED"
  }
});  

但是得到错误:不能使用部分(正在进行的.offers.0.status)来遍历元素({ongoing:[{_id:null,...

有没有更新的方法,解决方案需要与spring Data兼容。

3 个答案:

答案 0 :(得分:0)

据我所知,没有办法在MongoDB中更新两层深层次的文档。我偶然发现了这个JIRA项目。我不认为在更新操作中可以使用多个$运算符。

https://jira.mongodb.org/browse/SERVER-831

我不知道任何基于您当前架构的变通方法,但我建议您说,将您的每个onGoing阵列拆分为不同的文档。

答案 1 :(得分:0)

JS方式:

db.repairJobs.find().forEach(function(doc){
 //make changes on the JSON(BSON) object here. 
 db.repairJobs.save(doc);
}
);

示例:

db.repairJobs.find().forEach(function(doc){
    var valueToCheck = ['56897', '56457']
    for(var i =0; i< doc.ongoing.offers.length; i ++){
        if(valueToCheck.indexOf(doc.ongoing.offers[i].id) > -1){
            doc.ongoing.offers[i].status =  "ACCEPTED"
        }
    }
    db.repairJobs.save(doc);
    }
);

答案 2 :(得分:0)

您可以使用数组过滤器执行此操作

Update Nested Arrays in Conjunction with $[]

关于您的问题,我的解决方法是

db.repairJobs.update(
{},
{
  $set: {
    "onGoing.$[].offers.$[elem].status": "ACCEPTED"
  }
},
{ 
  arrayFilters: [{ "elem.id": {$in: [56897, 56457]} }],
  multi: true 
});