2014-06-29 36 views
0

我看了很久,沒有找到答案。 Node.JS的MongoDB驅動程序文檔說,你可以使用插入(文檔)進行批量插入,這很好,並且效果很好。如何在MongoDB中批量保存對象數組?

我現在有超過4,000,000個項目的集合,我需要爲它們全部添加一個新字段。通常mongodb每100ms只能寫1個事務,這意味着我會等待幾天來更新所有這些項目。我如何做一個「批量保存/更新」來一次更新它們? update()和save()似乎只適用於單個對象。

僞代碼:

var stuffToSave = []; 
db.collection('blah').find({}, function(err, stuff) { 
    stuff.toArray().forEach(function(item)) { 
     item.newField = someComplexCalculationInvolvingALookup(); 
     stuffToSave.push(item); 
    } 
} 
db.saveButNotSuperSlow(stuffToSave); 

當然,我需要提上做一些像萬某些限制,一次不嘗試做所有4個萬人一次,但我想你明白了吧。

+0

很多方法。分享一些代碼,甚至不好。最近版本的驅動程序支持更新和其他操作的批量操作。你的「統計數據」也與你自己的實施有關。不是一個在任何地方都一致的「硬」數字。 –

+0

在第一部分中,您將討論插入。在第二部分中,你建議你需要做一個更新,這是哪一個?插入=新文檔,更新=更改現有文檔 –

+0

我只是指出我想要在插入中提供的save()api中提供的相同功能。我會用一些僞代碼進行更新。 – user3690202

回答

0

MongoDB允許您使用一個db.collection.update(query, update, options)調用來更新許多與特定查詢相匹配的文檔,請參閱documentation。例如,

db.blah.update(
    { }, 
    { 
     $set: { newField: someComplexValue } 
    }, 
    { 
     multi: true 
    } 
) 

multi選項允許命令更新符合查詢條件的所有文件。請注意,使用Node.JS驅動程序時完全相同,請參見that documentation

如果你在一個集合進行許多不同更新,你可以用它們放在一個Bulk()建設者,以避免一些發送多個更新數據庫的開銷。

相關問題