使用MongoDB中不同的ID更新多个文档

时间:2016-10-05 20:03:11

标签: javascript node.js mongodb mongoose database

现在我正在使用

更新多个子文档
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);
});

1 个答案:

答案 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);

MongoDB NodeJS Driver Documentation