2014-03-07 51 views
7

我试图使用插入带有一个collection.insert呼叫100K左右的文件标准Mongo DB driver for Node.JSNode.JS Mongo DB驱动程序没有拆分批量插入?

var MongoClient = require('mongodb').MongoClient; 

MongoClient.connect('mongodb://localhost/testdb', function(err, db) { 
    var collection = db.collection('testcollection'); 
    var docs = []; 

    var doc = { 
     str: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet urna consequat quam pharetra sagittis vitae at nulla. Suspendisse non felis sollicitudin, condimentum urna eu, congue massa. Nam arcu dui, sodales eget auctor nec, ullamcorper in turpis. Praesent sit amet purus mi. Mauris egestas sapien magna, a mattis tellus luctus et. Suspendisse potenti. Nam posuere neque at vulputate ornare. Nunc mollis lorem est, at porttitor augue sodales sed. Ut dui sapien, fermentum eu laoreet sed, sodales et augue. Aliquam erat volutpat.' 
    }; 

    for (var i = 0; i < 100000; i++) { 
     docs[i] = doc; 
    } 

    collection.insert(docs, function(err) { 
     throw err; 
    }); 
}); 

不过,我得到以下错误:

/var/node/testproject/node_modules/mongodb/lib/mongodb/connection/base.js:242 
     throw message; 
      ^
Error: Document exceeds maximum allowed bson size of 16777216 bytes 
    at InsertCommand.toBinary (/var/node/testproject/node_modules/mongodb/lib/mongodb/commands/insert_command.js:86:11) 
    at Connection.write (/var/node/testproject/node_modules/mongodb/lib/mongodb/connection/connection.js:230:42) 
    at __executeInsertCommand (/var/node/testproject/node_modules/mongodb/lib/mongodb/db.js:1857:14) 
    at Db._executeInsertCommand (/var/node/testproject/node_modules/mongodb/lib/mongodb/db.js:1930:5) 
    at insertAll (/var/node/testproject/node_modules/mongodb/lib/mongodb/collection/core.js:205:13) 
    at Collection.insert (/var/node/testproject/node_modules/mongodb/lib/mongodb/collection/core.js:35:3) 
    at /var/node/testproject/dbtest.js:15:16 
    at /var/node/testproject/node_modules/mongodb/lib/mongodb/mongo_client.js:431:11 
    at process._tickCallback (node.js:664:11) 

由于单个文件明显小超过16 MB并给出堆栈跟踪,看起来驱动程序不会自动分割命令。我如何解决这个问题,最好是自己编写代码?

+0

你可以显示你的实际调用。当然不是全部,而是你如何做这件事的总结。 –

+0

@NeilLunn我添加了一个简单的例子来说明问题。 – Overv

+0

Thx。可能不是这里的答案。但检查你的潜水员版本,并确保它是最新的。然后我会添加一些代码来检查插入前的字节大小。当然还是提交给JIRA。另外,如果你能够,你能否对照2.6 RC进行测试。使用runCommand表单[here](http://docs.mongodb.org/master/reference/command/insert/#dbcmd.insert) –

回答

5

我在问问题,以澄清你在做什么,并怀疑文件数组确实超过64MB。

您似乎认为这是每个文档的限制,但您不期望的是您的整个请求实际上是一个BSON文档。

这是mongodb的有线协议的一部分,因为这样的批量请求受同样的限制,因为您的整个提交的大小不能超过16MB。

如果您查看2.6 documentation中的插入和更新操作的runCommand页面,则会清楚地说明。

所以从本质上讲,这不是一个错误。您需要拆分大批量请求,并将它们保持在16MB大小以下。

+0

是的,但它是一个限制。例如,Python驱动程序会自动分割命令。 Mongo DB本身只有文档限制。 – Overv

+0

@Overv可能是一种看待它的方式,但我怀疑它会受欢迎。例如,我不希望SQL类型的驱动程序在批处理操作中为我完成这种工作,而且我实际上并不知道会有这样的工作。我认为可以接受的方法是,您有责任将事情保持在有线协议限制之下,而不是驱动程序。 –

+0

不够公平,作为数据库和MongoDB的新手,它似乎是应该自动工作的东西。 – Overv