次の反復に進む前に非同期呼び出しが完了するのを待っていないため、爆発しました。これが意味するのは、これが問題を引き起こすまで、未解決の操作の「スタック」を構築しているということです。このサイトの名前は何ですか?写真を入手しますか?
したがって、これは"Bulk"
を続行するための最良の方法ではありません。 挿入。幸い、前述のコールバックの問題は別として、基盤となるMongoDBドライバーはすでにこれについて考えています。実際には、 "BulkAPI"
があります。 これをずっと良くするために利用できます。そして、すでにネイティブドライバーをdb
としてプルしたと仮定します 物体。しかし、私は.collection
を使用することを好みます モデルからのアクセサー、および "async"
すべてを明確にするモジュール:
var bulk = Model.collection.initializeOrderedBulkOp();
var counter = 0;
async.whilst(
// Iterator condition
function() { return count < 1000000 },
// Do this in the iterator
function(callback) {
counter++;
var model = buildModel(counter);
bulk.insert(model);
if ( counter % 1000 == 0 ) {
bulk.execute(function(err,result) {
bulk = Model.collection.initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}
},
// When all is done
function(err) {
if ( counter % 1000 != 0 )
bulk.execute(function(err,result) {
console.log( "inserted some more" );
});
console.log( "I'm finished now" ;
}
);
違いは、スタックを構築するだけでなく、完了時に両方の「非同期」コールバックメソッドを使用することと、1000エントリのバッチ更新ステートメントですべてを送信することによって非同期書き込み呼び出しを軽減するために「BulkOperationsAPI」を使用することです。
これは、独自のサンプルコードのように関数実行の「スタックを構築」するだけでなく、すべてを個別のステートメントで送信するのではなく、サーバーコミットメントのために管理可能な「バッチ」に分割することにより、効率的な「ワイヤー」トランザクションを実行します。 。