Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代MongoDB集合以复制所有文档的速度非常慢_Mongodb_Mongo Shell - Fatal编程技术网

迭代MongoDB集合以复制所有文档的速度非常慢

迭代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

在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.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
)