Verzend de bulk-invoegbewerkingen in batches, omdat dit resulteert in minder verkeer naar de server en dus efficiënte overboekingstransacties uitvoert door niet alles in afzonderlijke overzichten te verzenden, maar eerder op te splitsen in hanteerbare brokken voor serververplichting. Er is ook minder tijd om te wachten op het antwoord in de callback met deze aanpak.
Een veel betere benadering hierbij zou het gebruik van de async zijn module, dus zelfs het herhalen van de invoerlijst is een niet-blokkerende bewerking. Het kiezen van de batchgrootte kan variëren, maar het selecteren van batch-invoegbewerkingen per 1000 items zou het veilig maken om onder de 16 MB BSON harde limiet te blijven, aangezien het hele "verzoek" gelijk is aan één BSON-document.
Het volgende demonstreert het gebruik van de async module is while om de array te doorlopen en herhaaldelijk de iterator-functie aan te roepen, terwijl test true retourneert. Belt terug wanneer gestopt of wanneer er een fout optreedt.
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!");
}
);