2013-02-23 70 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