【问题标题】:How to update multiple items in array with multiple values如何使用多个值更新数组中的多个项目
【发布时间】:2021-03-20 21:53:43
【问题描述】:

我有以下文档架构:

let document = {
    _id: 'a1',
    name: 'some_name',
    items: [{
            _id: 1,
            name: 'item1',
        },
        {
            _id: 2,
            name: 'item2',
        },
        {
            _id: 3,
            name: 'item3',
        },
        {
            _id: 4,
            name: 'item4',
        },
    ]
}

以下更新有效负载是文档列表

let updates = [{
        _id: 1,
        name: 'item11',
    },
    {
        _id: 2,
        name: 'item22',
    },
    {
        _id: 3,
        name: 'item33',
    },
    {
        _id: 4,
        name: 'item44',
    },
]

我想用更新负载中具有相同_id 的项目更新集合中的每个项目

我该怎么做?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    这是一个与每个唯一 _id 相关的过于具体的更新(因此 updateMany 将不起作用 - 这不是“很多”每个 _id 都是唯一的)。也许相关: MongoDB: update every document on one field

    在您的情况下,就像运行 4 次 updateOne (并且每次将名称更改为某个值)。

    一种选择是使用bulkWrite

    https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/

    db.myCollection.bulkWrite([
          { updateOne : {
             "filter" : { "_id" : "1" },
             "update" : { $set : { "name" : "item11" } }
          },
          { updateOne : {
             "filter" : { "_id" : "2" },
             "update" : { $set : { "name" : "item22" } }
          }
    ]);
    

    另一种选择是使用纯 Javascript(和 mapfor)并针对数组中的每个项目 updateOne

    仅大纲(您应该在 MongoDB 游乐场测试此概念)。

    updates.map(function(item) {
      console.log(item._id); // 1 2 3 4
      console.log(item.name); // item11 item22 item33 item44
      db.myCollection.updateOne(
        { "_id" : item._id  }, /* filter */
        { $set: { "_id" : item.name } } /* update */
      );
    })
    

    【讨论】:

      猜你喜欢
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2019-10-21
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 2015-10-09
      相关资源
      最近更新 更多