それは可能ですが、これを行うには呼び出し規約を変更する必要があります。これは、「コールバック」フォームのみが実際にコレクションオブジェクトを返し、そこから .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のドキュメントに記載されているものと同じ形式です。