2014-03-07 54 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