在 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 的多个文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB聚合在Java中具有不同的价值?

通过在 body、mongoose/mongodb 中提供文档来更新多个文档

mongodb更新数组中的单个对象

具有多个字段的类似 MongoDB 的语句

PHP:具有不同名称的多个按钮以使用 AJAX 更新 MySQL 数据库

MongoDB $查找具有不同值的对象数组