【问题标题】:Updating multiple documents with different ids in MongoDB在 MongoDB 中更新具有不同 id 的多个文档
【发布时间】: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


【解决方案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 个。
猜你喜欢
  • 1970-01-01
  • 2021-01-16
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多