代码之家  ›  专栏  ›  技术社区  ›  Lahiru Chandima

基于MongoDB中的属性更新嵌套数组对象

  •  1
  • Lahiru Chandima  · 技术社区  · 6 年前

    我有一个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
        }]
    }
    

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Ashh    6 年前

    你需要使用 $ positional 用于更新数组元素和的运算符 multi: true 选项可以用相同的匹配项更新多个文档

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

    和mongodb一起 三点六 arrayFilters

    db.collection.update(
      { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
      { '$set': { 'items.$[item].itemName': 'New Name' }},
      { 'arrayFilter': [{ 'item.itemName': 'Name 1' }], 'multi': true }
    )
    
        2
  •  0
  •   Amit Wagner    6 年前

    你可以使用mongoDb arrayFilters

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