【问题标题】:Mongodb update an object in multi nested arrayMongodb更新多嵌套数组中的对象
【发布时间】:2016-07-12 16:27:23
【问题描述】:

我在 mongodb 中有一个文档,其中包含我需要更新的 2 级深度嵌套对象数组,就像这样。

{
  "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"
  }
});  

但是报错:不能使用部分(ongoing of progress.offers.0.status)来遍历元素({ongoing: [ { _id: null, ...

有什么方法可以更新,解决方案需要兼容spring Data。

【问题讨论】:

    标签: arrays mongodb nested


    【解决方案1】:

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

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

    我不知道基于您当前架构的任何解决方法,但我建议您将每个 onGoing 数组拆分为不同的文档。

    【讨论】:

    • 感谢回复
    【解决方案2】:

    您可以使用数组过滤器来做到这一点

    Update Nested Arrays in Conjunction with $[]

    至于你的问题,我的解决方案是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2015-01-31
      • 2023-01-12
      相关资源
      最近更新 更多