如何使用Mongoskin无序批量插入?

我在使用Mongoskin在Node上执行批量插入(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来执行无序批量操作? 如果是这样,我做错了什么?

你可以做到这一点,但你需要改变你的调用约定来做到这一点,因为只有“callback”forms将实际返回一个集合对象,从中可以调用.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 }); }); 

所以实际的“批量”方法本身不需要callback,并且完全按照文档中所示的那样工作。 这个例外是.execute() ,它实际上将语句发送到服务器。

虽然驱动程序会在某种程度上对此进行分类,但在调用execute之前排队执行太多操作可能不是一个好主意。 这基本上是build立在内存中,虽然驱动程序一次只能批量发送1000个(这是一个服务器限制,以及完整的批量低于16MB),但是您可能需要稍微多一点的控制,至less限制内存使用。

这就是所示的模testing的要点,但是如果构build操作的内存和一个可能非常大的响应对象对您来说不是问题,那么您可以保持排队操作并调用.execute()一次。

“响应”格式与BulkWriteResult文档中给出的格式相同。