Send bulkinsert-operationerne i batches, da dette resulterer i mindre trafik til serveren og dermed udfører effektive wire-transaktioner ved ikke at sende alt i individuelle opgørelser, men derimod bryde op i håndterbare bidder til serverforpligtelse. Der er også mindre tid til at vente på svaret i tilbagekaldet med denne tilgang.
En meget bedre tilgang til dette ville være at bruge async modul, så selv at sløjfe inputlisten er en ikke-blokerende operation. Valg af batchstørrelse kan variere, men at vælge batchindsættelsesoperationer pr. 1000 poster ville gøre det sikkert at forblive under 16 MB BSON hårde grænse, da hele "anmodningen" er lig med ét BSON dokument.
Det følgende demonstrerer brugen af async modul, mens de gentager arrayet og gentagne gange kalder iteratorfunktionen, mens testen returnerer sand. Ringer tilbage, når den er stoppet, eller når der opstår en fejl.
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!");
}
);