现在我正在使用
更新多个子文档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();
});
但会有更好的表现吗?
我尝试实施你的建议但没有任何反应。
我调试了一下,似乎在第一行代码之后没有发生任何事情:
console.log('this is printed')
const batch = ModelName.initializeUnorderedBulkOp();
console.log('this is _not_ printed')
你知道是什么原因引起的吗?我没有收到任何错误消息。
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);
});
答案 0 :(得分:0)
当然,您可以进行无序批量操作。这只会对数据库服务器进行一次调用。是的,这比前者有显着的性能提升。
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);