什么是MongoDB批量操作最大尺寸?

Ela*_*lad 11 mongodb

根据MongoDB 文档:

批量操作规模

批量操作最多可以有1000次操作.

但是,使用Mongo 2.6批量操作API和node-mongodb-native(collection.initializeUnorderedBulkOp()等),我能够使用大得多的操作数(大约300k操作)

这个限制是否已过时,或者我只是遗漏了什么?你知道什么是真正的限制吗?

Ela*_*lad 19

我在MongoDB的Jira 开了一张票.他们回答说:

你是对的; 此限制需要在文档中进行一些说明.限制在服务器上,但客户端驱动程序通过将批量操作拆分为多个批次来隐藏应用程序开发人员的限制.


Nei*_*unn 6

这是一个有趣的声明,它是 2.6 版本的文档中的新内容,因此您会看到这在您为早期版本引用的部分中不存在。

当然,真正的限制是 16MB BSON 限制,因为这将是可以通过线路发送的最大大小,因为它实际上是一个BSON 文档。当您意识到这是一个位于诸如“批量更新”中所示的更新的 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();
Run Code Online (Sandbox Code Playgroud)

或者类似的东西,取决于你在做什么。因此,这将大大少于您使用的卷,但基本上是在网络上不太大的可管理块中,并且肯定安全地低于 16MB。

因此,BSON 限制是绝对的硬限制,但出于实际原因,并考虑到您可能希望检查在一个大文档中也会收到的错误状态作为响应,您可能希望将它们保存在较小的块中。

这比一次执行一个操作要好,我不知道我是否真的想一次通过网络发送多达 16MB 的数据和/或检查 16MB 的响应是否存在可能的错误。