猫鼬 updateMany 动态

Mongoose updateMany dynamically

我有一个看起来像这样的集合(为简洁起见删除了字段):

[
    { "id": "A", "name": "AA" ,"arrayField": [1, 2, 3] },
    { "id": "B", "name": "BB" ,"arrayField": [4, 5, 6] },
    { "id": "C", "name": "CC" ,"arrayField": [7, 8] }
]

将每个对象视为一个文档。


现在在我的应用程序中,经过一些业务逻辑后,我有一个 POJO 数组,如下所示:

[
    { "id": "A", "name": "AB", "arrayField": [1, 2, 3] },
    { "id": "B", "name": "VB", "arrayField": [4, 5, 6] },
    { "id": "C", "name": "DE", "arrayField": [7, 8] }
    { "id": "D", "name": "GG", "arrayField": [10, 11] }
]

请注意,这些对象没有文档所需的其他字段。

如何更新 MongoDB 集合以反映与对象数组中的相同?

我 tried/thought 的

注:arr是正在谈论的对象数组。

  1. updateManyupsert:

    Model.updateMany({ id: { $in: arr.map(({ id }) => id) } }, arr, { upsert: true });
    
  2. 映射对象数组并使用 upsert 更新:

    await Promise.all(
        arr.map(({ id, arrayField, name }) => {
            return Model.updateOne({ id }, { $set: { arrayField, name } }, { upsert: true });
        })
    );
    

有什么方法可以使用 transactions/aggregations/etc.?

正如@ray 在评论中建议的那样,我正在寻找 bulk operations。我做了一些事情:

const bulk = Model.initializeUnorderdBulkOp();
arr.forEach(({ id, arrayField, name }) => {
    bulk.find({ id }).upsert().updateOne({ $set: { arrayField, name } });
});
bulk.execute();