在 MongoDB 中更新具有不同 id 的多个文档
Posted
技术标签:
【中文标题】在 MongoDB 中更新具有不同 id 的多个文档【英文标题】:Updating multiple documents with different ids in MongoDB 【发布时间】:2017-02-14 09:59:16 【问题描述】:现在我正在更新多个子文档
var positions = [
id: '1', position: x: 0, y: 0 ,
...
];
positions.forEach(element =>
Model.findOneAndUpdate( _id: modelId, 'elements._id': element.id ,
$set:
'elements.$.position': element.position
);
);
但是是否可以只调用 1 次调用数据库?
编辑
例如,我可以这样做
Model.findById(modelId).then(model =>
positions.forEach(element =>
const doc = model.elements.id(element.id);
doc.position = element.position;
);
model.save();
);
但它会有更好的性能吗?
编辑 2
我尝试实施您的建议,但没有任何反应。
我调试了一下,第一行代码之后好像什么都没有发生:
console.log('this is printed')
const batch = ModelName.initializeUnorderedBulkOp();
console.log('this is _not_ printed')
你知道是什么原因造成的吗?我没有收到错误消息。
编辑 3
var batch = ModelName.initializeUnorderedBulkOp();
positions.forEach(element =>
batch.findOneAndUpdate( _id: modelId, 'elements._id': element.id ,
$set:
'elements.$.position': element.position
);
);
batch.execute().then(() =>
console.log('success');
).catch(err =>
console.log(err);
);
【问题讨论】:
您不能将批次设为常量。它需要是可变的,因为我们正在向批处理过程添加操作。让它成为一个变量。 它也不适用于var batch = ModelName.initializeUnorderedBulkOp();
。
请发布您的代码。您是否像我的示例一样添加到批处理操作中?你以execute()
为例吗?
是的,我愿意。查看我更新的问题
【参考方案1】:
当然,您可以进行无序批量操作。它只调用一次数据库服务器。是的,与前者相比,这具有显着的性能改进。
var batch = Model.initializeUnorderedBulkOp();
var positions = [
nodeId: '1', position: x: 0, y: 0 ,
nodeId: '2', position: x: 3, y: 4 ,
];
positions.forEach(el =>
batch.findOneAndUpdate(<YOUR STUFF>);
);
batch.execute().then(console.log);
MongoDB NodeJS Driver Documentation
【讨论】:
这是否与我的第二个示例相同,我只调用一次parent.save()
?
不,因为您正在调用 find
然后是 save
从而进行 2 db 调用。这只有 1 个。以上是关于在 MongoDB 中更新具有不同 id 的多个文档的主要内容,如果未能解决你的问题,请参考以下文章
通过在 body、mongoose/mongodb 中提供文档来更新多个文档