我是一个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()操作?)
谢谢!
答案 0 :(得分:1)
如果没有匹配的文档,则将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的建议修改了代码。