[英]How to use unordered bulk inserting with Mongoskin?
我在使用 Mongoskin 在 Node.js 上執行批量插入(MongoDB 2.6+)時遇到問題。
var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
var bulk = db.collection('collection').initializeUnorderedBulkOp();
for (var i = 0; i < 200000; i++) {
bulk.insert({number: i}, function() {
console.log('bulk inserting: ', i);
});
}
bulk.execute(function(err, result) {
res.json('send response statement');
});
上面的代碼給出了以下警告/錯誤:
(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'
(node) warning: possible EventEmitter memory leak detected. 51 listeners added. Use emitter.setMaxListeners() to increase limit.
TypeError: Object #<SkinClass> has no method 'execute'
是否可以使用 Mongoskin 執行無序批量操作? 如果是這樣,我做錯了什么?
您可以這樣做,但您需要更改調用約定來執行此操作,因為只有“回調”表單實際上會返回一個集合對象,可以從中調用.initializeUnorderedBulkOp()
方法。 您認為它的工作方式也存在一些用法差異:
var dbURI = urigoeshere;
var db = mongo.db(dbURI, {safe:true});
db.collection('collection',function(err,collection) {
var bulk = collection.initializeUnorderedBulkOp();
count = 0;
for (var i = 0; i < 200000; i++) {
bulk.insert({number: i});
count++;
if ( count % 1000 == 0 )
bulk.execute(function(err,result) {
// maybe do something with results
bulk = collection.initializeUnorderedBulkOp(); // reset after execute
});
});
// If your loop was not a round divisor of 1000
if ( count % 1000 != 0 )
bulk.execute(function(err,result) {
// maybe do something here
});
});
因此,實際的“批量”方法本身不需要回調,並且完全按照文檔中所示的方式工作。 執行是.execute()
,它實際上將語句發送到服務器。
雖然驅動程序會為您解決一些問題,但在調用 execute 之前將太多操作排隊可能不是一個好主意。 這基本上是在內存中建立的,雖然驅動程序一次只會發送 1000 個批次(這是服務器限制以及完整批次低於 16MB ),但您可能需要在這里進行更多控制,至少限制內存使用。
這就是所示的模測試的重點,但是如果用於構建操作的內存和可能非常大的響應對象對您來說不是問題,那么您可以繼續排隊操作並調用.execute()
一次。
“響應”的格式與BulkWriteResult文檔中給出的格式相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.