【发布时间】: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()为例吗? -
是的,我愿意。查看我更新的问题
标签: javascript node.js mongodb mongoose database