猫鼬 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 集合以反映与对象数组中的相同?
- 我想更新 仅
arrayField
和 name
文档字段 id
A、B** 和 C 来反映对象数组。
- 还有一个包含
id
D 的新文档必须插入到集合中(其他字段将被处理,因为它们具有默认值在架构中)。
我 tried/thought 的
注:arr
是正在谈论的对象数组。
updateMany
与 upsert
:
Model.updateMany({ id: { $in: arr.map(({ id }) => id) } }, arr, { upsert: true });
映射对象数组并使用 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();
我有一个看起来像这样的集合(为简洁起见删除了字段):
[
{ "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 集合以反映与对象数组中的相同?
- 我想更新 仅
arrayField
和name
文档字段id
A、B** 和 C 来反映对象数组。 - 还有一个包含
id
D 的新文档必须插入到集合中(其他字段将被处理,因为它们具有默认值在架构中)。
我 tried/thought 的
注:arr
是正在谈论的对象数组。
updateMany
与upsert
:Model.updateMany({ id: { $in: arr.map(({ id }) => id) } }, arr, { upsert: true });
映射对象数组并使用 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();