迭代MongoDB集合以复制所有文档的速度非常慢
在MongoDB集合中,我有一个7000000个文档的集合,每个文档可能有1-2kb的BSON,我想复制它,修改一个字段。该字段是一个带有数值的字符串,我想将该字段增加1 根据Mongo shell,我采取了以下方法:迭代MongoDB集合以复制所有文档的速度非常慢,mongodb,mongo-shell,Mongodb,Mongo Shell,在MongoDB集合中,我有一个7000000个文档的集合,每个文档可能有1-2kb的BSON,我想复制它,修改一个字段。该字段是一个带有数值的字符串,我想将该字段增加1 根据Mongo shell,我采取了以下方法: > var all = db.my_collection.find() > all.forEach(function(it) { ... it._id = 0; // to force mongo to create a new objectId ... it.fi
> 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);
... })
执行以下代码需要非常长的时间;起初,我以为代码不知怎么被破坏了,但在一个单独的终端上,我检查了收集的状态,大约一个小时后,发现进程仍在运行,现在有7000001个文档!我检查后发现,确实有1个新文档与递增字段匹配
在上下文中,我运行的是一个具有4个内核和16 GB ram的2015 MBP。我看到mongo在我的CPU开销中接近顶端,平均约为85%
1我是否缺少Mongodb中的批量修改/更新功能
2.为什么上面的操作可以运行,但运行速度太慢,以致于以每小时1次的速度更新文档?我很不好意思地说,我错认为这一行:
... it._id = 0; // to force mongo to create a new objectId
确实迫使mongo创建一个新的ObjectId。相反,我需要:
尝试db.collection.mapReduce方法:
注意:单个emit只能容纳MongoDB最大BSON文档大小的一半
MongoDB不会为只有一个值的键调用reduce函数
最后,
db.my_collection.mapReduce(
mapFunction1,
reduceFunction1.
{"out":"my_collection"} //Replaces the entire content; consider merge
)
您能详细说明一下如何考虑合并吗?对于这种情况,**替换**默认发生,并且集合的整个内容被Read的输出替换。写入{out:{merge:my_collection}}将替换现有的匹配键并覆盖它们。
var mapFunction1 = function() {
emit(ObjectId(), (parseInt(this.field) + 1).toString());
};
var reduceFunction1 = function(id, field) {
return field;
};
db.my_collection.mapReduce(
mapFunction1,
reduceFunction1.
{"out":"my_collection"} //Replaces the entire content; consider merge
)