2014-10-02 77 views
1

我是一个mongodb noob,并且遇到了一些困难,试图使用MongoDB bulk operations创建相当于批量保存(因为我无法找到批量保存操作)。简要地说,给定的文件的数组:MongoDB Bulk Save Equivalent?

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

我要批量UPSERT阵列中的文件,使用_id属性作为比较字段以确定传入记录相当于已经在mongodb的记录。在伪码中我想的MongoDB批量UPSERT如下:

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

理想情况下,我想通过MONGO阵列和比较器VS排队个体批量操作为每个文档。

我该怎么做Bulk.find().upsert().update(<update>);或类似的? (或者,是否有无文件批量save()操作?)

谢谢!

回答

1

Bulk.find.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()) { 
    ... 
} 

更多或更少,我很抱歉,我不能在此刻进行测试。我也无法说出它将如何处理大量文件。

UPDATE

我修改后的代码,通过科林的建议。

+0

我在问题中提到了save()。问题是在mongodb的批量模式下获得类似于工作的东西(http://docs.mongodb.org/manual/reference/method/js-bulk/)。而且,save API只声称一次只接受一个文档,是否有办法将它传递给一个数组? – Colin 2014-10-02 20:35:57

+0

@Colin对不起,我误解了你的问题。我不认为有'Bulk.save()'操作。 – Ernest 2014-10-02 20:53:12

+0

不用担心。有没有办法使用批量upsert解决它? – Colin 2014-10-02 21:00:21