2011-05-31 76 views
8

使用mongodb shell,我試圖向大集合中的每個文檔添加一個新屬性。集合(Listing)有一個名爲Address的現有屬性。我只是試圖添加一個名爲LowerCaseAddress的新屬性,它可以用於搜索,以便我不需要使用區分大小寫的正則表達式來進行地址匹配,這很慢。將新屬性添加到大集合中的每個文檔

這裏是我試過的外殼使用的腳本:

for(var c = db.Listing.find(); c.hasNext();) { 
    var listing = c.next(); 
    db.Listing.update({ LowerCaseAddress: listing.Address.toLowerCase() }); 
} 

它跑了〜6小時,然後我的電腦死機了。是否有更好的方式爲大集合中的每個文檔添加新屬性(大約400萬條記錄)?

+0

它看起來就像你在更新缺少一些參數 - 你沒有一個標準,所以它可能試圖更新每個記錄循環的每次迭代。 (如果你沒有在更新中設置標準,我實際上並不確定mongo是如何表現的) – 2011-05-31 13:39:27

+0

javascript在這裏不起作用。看看Sid Burn的回答。此外,如果您必須更新大量文檔,則可能需要批量執行以避免鎖定並在出現故障時獲取進度檢查點。 – 2011-06-01 17:23:25

回答

17

你JavaScript沒有工作,但下面的代碼工作。但不知道多久需要400萬條記錄。

db.Listing.find().forEach(function(item){ 
    db.Listing.update({_id: item._id}, {$set: { LowerCaseAddress: item.Address.toLowerCase() }}) 
}) 
+0

此查詢花了一段時間,但它的工作,謝謝! – Justin 2011-06-02 12:30:28

1

您可以使用updateMany本太:

try { db.<collection>.updateMany({}, {$set: { LowerCaseAddress: item.Address.toLowerCase() } }); } catch(e) { print(e); }

相關問題