MongoDB批量保存等价?

时间:2014-10-02 18:49:30

标签: javascript mongodb

我是一个mongodb菜鸟,并且在尝试使用MongoDB bulk operations创建等效的批量保存(因为我无法找到批量保存操作)时遇到了一些困难。简而言之,给出了一系列文件:

[{ _id:1, name:"a" ... }, { _id:1, name:"b" ... } ... ]

我想在数组中批量转发文档,使用_id属性作为比较字段来确定哪些传入记录等同于mongodb中已有的记录。在伪代码中,我希望mongodb批量upsert如下:

if(incomingDocument._id == existingDocument._id){
  update(incoming) // overwrite existing document with entire incoming document
} else {
  insert(incoming)
}

理想情况下,我想通过mongo数组和比较器来排除每个文档的单独批量操作。

我如何/可以使用Bulk.find().upsert().update(<update>);或类似内容执行此操作? (或者,是否存在未记录的批量save()操作?)

谢谢!

1 个答案:

答案 0 :(得分:1)

Bulk.find.upsert

  

如果没有匹配的文档,则将upsert选项设置为true   Bulk.find()条件,然后更新或替换   操作执行插入。如果确实存在匹配的文档,那么   更新或替换操作执行指定的更新或   更换。

但是你需要遍历你的收藏:

var bulk = db.items.initializeUnorderedBulkOp();
myDocumnets.forEach(function(doc) {
  bulk.find({_id: doc._id}).upsert().replaceOne(doc);
});
bulk.execute({w: 1, j: true}, function (err, result) {
  if (result.isOk()) {
    ...
}

更多或更少,我很抱歉我目前无法测试它。我也无法说出它对大量文件的影响。

更新

我按照Colin的建议修改了代码。