2013-02-23 67 views
1

我試圖找到最快的方式來遍歷MongoDB中的數據。我在收集中有60k個文檔,並且我想要remove全部fields在每個文檔中的值爲NULL。 (從MySQL轉移)。我的測試功能只是刪除一個字段是:MongoDB迭代

db.collection.find({cc_type:null}).forEach(function(u) { 
      db.collection.update(u, {$unset:{"cc_name":1} 
      //some other null-value fields to check 
}); 

然後需要20秒才能完成數據。我究竟做錯了什麼?另外,我正在使用PHP的MongoDB驅動程序。在PHP中迭代數據而不是使用MongoDB工具更有效率?迭代大量數據並對其進行一些更改(每個文檔的不同更改取決於存在的字段)有哪些最佳實踐?

+0

我的結論是:通過迭代去除多個字段會導致mongodb重建索引,從而導致嚴重的性能問題。 – castt 2013-03-29 03:30:49

回答

1

在一個update操作中執行操作會更快。在貝那就是:

db.collection.update({cc_type:null}, {$unset: {cc_name: 1}}, false, true) 

true參數是multi標誌,以便它會影響所有文檔而不只是第一個。

+0

將不起作用,因爲每個文檔中包含空值的字段數量未知。我如何知道哪些字段未被設置? – castt 2013-02-23 02:03:42

+0

@castt這個想法是重複一次你想從中刪除空值的每個字段的命令。 – JohnnyHK 2013-02-23 02:06:21

+0

如果我不知道哪個字段需要檢查空值,該怎麼辦?如果我有一個具有空值的唯一字段的60k文檔,該怎麼辦? – castt 2013-02-23 02:08:12