迭代MongoDB集合以复制所有文档非常缓慢

时间:2017-11-06 20:24:38

标签: mongodb mongo-shell

我在MongoDB集合中有7,000,000个文档(每个可能是1-2 KB BSON)的集合,我想复制,修改一个字段。该字段是一个带有数值的字符串,我想将该字段增加1。

关注this approach从Mongo shell开始,我采取了以下方法:

> var all = db.my_collection.find()
> all.forEach(function(it) { 
... it._id = 0; // to force mongo to create a new objectId
... it.field = (parseInt(it.field) + 1).toString();
... db.my_collection.insert(it);
... })

执行以下代码需要很长时间;起初我以为代码是以某种方式被破坏了,但是从一个单独的终端我检查了收集的状态,就像一个小时之后发现进程仍在运行,现在有7,000,001个文件!我检查确定,确实有1个新文档与增量字段匹配。

就上下文而言,我正在运行具有4核和16 GB内存的2015 MBP。我看到mongo接近我的CPU开销顶部,平均约为85%。

1)我是否错过了Mongodb中的批量修改/更新功能?

2)为什么上述操作会起作用,但工作速度慢以至于以1 / hr的速度更新文档会有什么原因?

2 个答案:

答案 0 :(得分:1)

尝试db.my_collection.mapReduce( mapFunction1, reduceFunction1. {"out":"my_collection"} //Replaces the entire content; consider merge ) 方式:

注意:单个发射只能容纳MongoDB最大BSON文档大小的一半。

{{1}}

MongoDB不会为只有一个值的键调用reduce函数。

{{1}}

最后,

{{1}}

答案 1 :(得分:0)

我很尴尬地说我错了这句话:

... it._id = 0; // to force mongo to create a new objectId

确实强制mongo创建一个新的ObjectId。相反,我需要explicit

... it._id = ObjectId();