MongoDB批量操作的最大大小是多少?

21
根据MongoDB的文档:文档
块操作最多可以有1000个操作。
然而,我使用Mongo 2.6的块操作API和node-mongodb-native(例如collection.initializeUnorderedBulkOp())进行更大操作计数(约300k次操作)。
这个限制是否已过时,还是我错过了什么?你知道真正的限制是什么吗?

1
最大大小为一个BSON文档,其当前限制设置为16兆字节,这就是MongoDB使用BSON文档进行通信的方式。 - Sammaye
2个回答

32

我在 MongoDB 的 Jira 上开了一张工单。他们回复说:

你说得对;文档需要对这个限制进行进一步澄清。这个限制是在服务器上的,但客户端驱动程序通过将批量操作拆分成多个批次来隐藏应用程序开发人员的限制。


7

这是一个有趣的陈述,并且在2.6版本的文档中是新内容,因此您会发现在您引用早期版本的部分中没有出现。

当然,真正的限制是16MB BSON限制,因为这将是可以通过网络发送的有效地一个 BSON文档的最大大小。当您意识到这是对像“批量更新”那样的update的runCommand表单之上的便捷API时,这变得更加清晰,或者明显可以采用这种形式进行插入。

我通常会将其编写为示例,检查添加批量操作时的当前迭代的模数,并仅每隔一段时间“执行”。 这不是节点驱动程序的确切语法,但基本上是:

var bulk = db.collection.initializeUnorderedBulkOp();
counter = 0;

longArrayOrStream.forEach(function(doc) {
    bulk.find({ "_id": doc._id }).update(
       { "$set": { "somefield": doc.somefield }});
    counter++;

    if ( counter % 500 == 0 ) {
        bulk.execute();
        counter = 0;
        bulk = db.collection.initializeUnorderedBulkOp();
    }
});

if ( counter > 0 )
    bulk.execute();

根据您的操作不同,可能会有类似的情况。因此,使用的数据量要少得多,但基本上是可管理的块,网络传输不会太大,而且肯定安全地低于16MB。
因此,BSON限制是绝对的硬性限制,但出于实际原因,考虑到您可能希望检查响应中可能收到的错误状态,您可能希望将其保留在较小的块中。
这比一次执行一个操作要好,我不知道是否真的想一次性发送高达16MB的数据或检查16MB响应以获取可能的错误。

很好的分割方法。你从哪里得到了500的大小? - user2402616
如果您将计数器重置为0,那么在这种情况下,我们真的需要模运算符吗? - user2402616

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接