【问题标题】:Update nested array objects based on a property in MongoDB根据 MongoDB 中的属性更新嵌套数组对象
【发布时间】:2021-05-14 03:15:48
【问题描述】:

我有一个 MongoDB 集合,其中的文档如下所示:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'Name 1',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}

现在,我想更新所有文档,以便将 itemName: 'Name 1' 更新为 itemName: 'New Name'。 更新后,上述文档应如下所示:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'New Name',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}

有什么方法可以做到这一点,而无需自己遍历所有文档?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    您需要使用$ positional 运算符来更新数组元素,使用multi: true 选项可以更新具有相同匹配的多个文档

    db.collection.update(
      { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
      { '$set': { 'items.$.itemName': 'New Name' }},
      { 'multi': true }
    )
    

    和 mongodb 3.6 arrayFilters

    db.collection.update(
      { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
      { '$set': { 'items.$[item].itemName': 'New Name' }},
      { 'arrayFilter': [{ 'item.itemName': 'Name 1' }], 'multi': true }
    )
    

    【讨论】:

    • 成功了。不得不做一点小改动:'$elemMatch': {itemName: 'Name 1'}
    【解决方案2】:

    你可以使用 mongoDb arrayFilters

    db.collection.update(
      { },
      { "$set": { "items.$[elem].itemName": 'new Name' } },
      { "arrayFilters": [{ "elem.itemName": 'Name 1' }], "multi": true }
    )
    

    【讨论】:

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