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

时间:2014-06-16 06:40:30

标签: mongodb

根据MongoDB documentation

  

批量操作尺寸

     

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

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

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

2 个答案:

答案 0 :(得分:18)

我在MongoDB的Jira中打开了ticket。他们回答说:

  

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

答案 1 :(得分:3)

这是一个有趣的声明,对于2.6版本的文档来说它是新的,所以你会发现在你为早期版本引用的部分中没有这个。

当然,真正的限制是16MB BSON限制,因为这可以通过线路发送的最大尺寸是有效一个 BSON文档。当你意识到这是一个召集的API时会更加清晰,比如update的runCommand形式,如“Bulk Updates”所示,或者其他插入显然只能采用这种形式。

我通常将此作为示例编写的方法将在添加批量操作时检查当前迭代的模型,并且每次都经常“执行”。不是节点驱动程序的确切语法,但基本上是:

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响应是否存在可能的错误。