Skicka bulkinsert-operationerna i omgångar eftersom detta resulterar i mindre trafik till servern och därmed utför effektiva överföringar genom att inte skicka allt i individuella uttalanden, utan snarare delas upp i hanterbara bitar för serveråtagande. Det är också mindre tid att vänta på svaret i återuppringningen med detta tillvägagångssätt.
Ett mycket bättre tillvägagångssätt med detta skulle vara att använda async modul så även att slinga ingångslistan är en icke-blockerande operation. Att välja batchstorlek kan variera, men att välja batch-insättningsoperationer per 1000 poster skulle göra det säkert att hålla sig under den hårda gränsen på 16 MB BSON, eftersom hela "begäran" är lika med ett BSON-dokument.
Följande visar hur du använder async moduls samtidigt som den itererar genom arrayen och upprepade gånger anropar iteratorfunktionen, medan testet returnerar sant. Ringer tillbaka när den stoppas eller när ett fel uppstår.
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!");
}
);