Als uw MongoDB-server 2.6 of nieuwer is, is het beter om gebruik te maken van schrijfopdrachten Bulk API die de uitvoering van bulk-invoegbewerkingen mogelijk maken, wat eenvoudigweg abstracties zijn bovenop de server om het gemakkelijk te maken om bulkbewerkingen te bouwen en zo prestatiewinst te behalen met uw update over grote verzamelingen.
Het in batches verzenden van de bulk-invoegbewerkingen resulteert in minder verkeer naar de server en voert dus efficiënte draadtransacties uit 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.
Deze bulkoperaties zijn er hoofdzakelijk in twee smaken:
- Bulkoperaties besteld . Deze bewerkingen voeren alle bewerkingen in volgorde uit en geven een foutmelding bij de eerste schrijffout.
- Ongeordende bulkbewerkingen . Deze bewerkingen voeren alle bewerkingen parallel uit en aggregeren alle fouten. Ongeordende bulkoperaties garanderen geen volgorde van uitvoering.
Let op, voor oudere servers dan 2.6 zal de API de bewerkingen naar beneden converteren. Het is echter niet mogelijk om 100% naar beneden te converteren, dus er kunnen enkele randgevallen zijn waarbij het niet correct de juiste cijfers kan rapporteren.
In uw geval zou u de Bulk API-invoegbewerking in batches van 1000 als volgt kunnen implementeren:
Voor MongoDB 3.2+ met behulp van bulkWrite
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulkUpdateOps = [];
entries.forEach(function(doc) {
bulkUpdateOps.push({ "insertOne": { "document": doc } });
if (bulkUpdateOps.length === 1000) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
bulkUpdateOps = [];
}
})
if (bulkUpdateOps.length > 0) {
collection.bulkWrite(bulkUpdateOps).then(function(r) {
// do something with result
});
}
};
Voor MongoDB <3.2
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
var entries = [ ... ] // a huge array containing the entry objects
var createNewEntries = function(db, entries, callback) {
// Get the collection and bulk api artefacts
var collection = db.collection('entries'),
bulk = collection.initializeOrderedBulkOp(), // Initialize the Ordered Batch
counter = 0;
// Execute the forEach method, triggers for each entry in the array
entries.forEach(function(obj) {
bulk.insert(obj);
counter++;
if (counter % 1000 == 0 ) {
// Execute the operation
bulk.execute(function(err, result) {
// re-initialise batch operation
bulk = collection.initializeOrderedBulkOp();
callback();
});
}
});
if (counter % 1000 != 0 ){
bulk.execute(function(err, result) {
// do something with result
callback();
});
}
};
Roep de createNewEntries()
. aan functie.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});