Hvis din MongoDB-server er 2.6 eller nyere, ville det være bedre at bruge en skrivekommando Bulk API der giver mulighed for udførelse af bulk insert-operationer, som blot er abstraktioner oven på serveren for at gøre det nemt at bygge bulk-operationer og dermed få præstationsgevinster med din opdatering over store samlinger.
At sende bulkinsert-operationerne i batches resulterer i mindre trafik til serveren og udfører dermed 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.
Disse bulkoperationer kommer hovedsageligt i to varianter:
- Bestilte masseoperationer . Disse operationer udfører hele operationen i rækkefølge og fejl ud på den første skrivefejl.
- Uordrede masseoperationer . Disse operationer udfører alle operationerne parallelt og samler alle fejlene. Uordnede masseoperationer garanterer ikke udførelsesrækkefølgen.
Bemærk, for ældre servere end 2.6 vil API'en nedkonvertere operationerne. Det er dog ikke muligt at nedkonvertere 100 %, så der kan være nogle randtilfælde, hvor den ikke kan rapportere de rigtige tal korrekt.
I dit tilfælde kunne du implementere Bulk API-indsættelsesoperationen i batches af 1000 som denne:
Til MongoDB 3.2+ ved hjælp af 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
});
}
};
For 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();
});
}
};
Kald createNewEntries()
funktion.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});