Wenn Ihr MongoDB-Server 2.6 oder neuer ist, wäre es besser, Schreibbefehle zu verwenden Bulk-API die die Ausführung von Masseneinfügungsvorgängen ermöglichen, die einfach Abstraktionen auf dem Server sind, um das Erstellen von Massenvorgängen zu vereinfachen und so mit Ihrem Update über große Sammlungen Leistungssteigerungen zu erzielen.
Das Senden der Bulk-Insert-Operationen in Stapeln führt zu weniger Datenverkehr zum Server und führt somit effiziente Überweisungen durch, indem nicht alles in einzelnen Anweisungen gesendet wird, sondern in überschaubare Teile für die Serverzusage aufgeteilt wird. Bei diesem Ansatz vergeht auch weniger Zeit beim Warten auf die Antwort im Rückruf.
Diese Bulk-Operationen gibt es hauptsächlich in zwei Varianten:
- Massenvorgänge bestellt . Diese Operationen führen alle Operationen der Reihe nach aus und geben beim ersten Schreibfehler einen Fehler aus.
- Ungeordnete Massenvorgänge . Diese Operationen führen alle Operationen parallel aus und aggregieren alle Fehler. Ungeordnete Massenoperationen garantieren keine Ausführungsreihenfolge.
Beachten Sie, dass die API bei älteren Servern als 2.6 die Operationen herunterkonvertiert. Es ist jedoch nicht möglich, 100 % herunterzukonvertieren, daher kann es einige Randfälle geben, in denen die richtigen Zahlen nicht korrekt gemeldet werden können.
In Ihrem Fall könnten Sie den Bulk-API-Einfügevorgang in Stapeln von 1000 wie folgt implementieren:
Für MongoDB 3.2+ mit 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
});
}
};
Für 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();
});
}
};
Rufen Sie createNewEntries()
auf Funktion.
MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});