【问题标题】:What is MongoDB batch operation max size?MongoDB 批处理操作的最大大小是多少?
【发布时间】:2014-08-05 22:27:12
【问题描述】:

根据 MongoDB documentation:

批量操作规模

一个批量操作最多可以有 1000 个操作。

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

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

【问题讨论】:

  • 最大大小是一个 BSON 文档,其当前限制设置为 16meg,这就是 MongoDB 使用 BSON 文档进行通信的方式。

标签: mongodb


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是一个有趣的声明,它是 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 尺寸的?
    • 如果您将计数器重置为 0,我们真的需要模运算符吗?
    猜你喜欢
    • 2014-01-19
    • 2014-02-15
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 2013-02-26
    • 2012-06-30
    相关资源
    最近更新 更多