我在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的速度更新文档会有什么原因?
答案 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();