2014-10-02 76 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