一括挿入操作をバッチで送信します。これにより、サーバーへのトラフィックが減少し、すべてを個別のステートメントで送信するのではなく、サーバーのコミットメントのために管理可能なチャンクに分割することで、効率的なワイヤートランザクションを実行します。このアプローチでは、コールバックでの応答を待つ時間も短縮されます。
これを使用するより良いアプローチは、 async を使用することです。 モジュールなので、入力リストをループすることも非ブロッキング操作です。バッチサイズの選択はさまざまですが、1000エントリごとにバッチ挿入操作を選択すると、「リクエスト」全体が1つのBSONドキュメントに等しいため、16MBのBSONハード制限を安全に下回ることができます。
以下は、 async の使用方法を示しています。 モジュールは、配列を反復処理し、反復関数を繰り返し呼び出しますが、testはtrueを返します。停止したとき、またはエラーが発生したときにコールバックを呼び出します。
var bulk = col.initializeOrderedBulkOp(),
counter = 0,
len = array.length,
buildModel = function(index){
return {
"data": array[index],
"metaData": {
"hash": hash,
"date": timestamp,
"name": name
}
}
};
async.whilst(
// Iterator condition
function() { return counter < len },
// 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 = col.initializeOrderedBulkOp();
callback(err);
});
} else {
callback();
}
},
// When all is done
function(err) {
if (counter % 1000 != 0) {
bulk.execute(function(err, result) {
console.log("More inserts.");
});
}
console.log("All done now!");
}
);