MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Korrekte Methode zum Einfügen vieler Datensätze in Mongodb mit Node.js

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();
    });
});