MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Manière correcte d'insérer de nombreux enregistrements dans Mongodb avec Node.js

Si votre serveur MongoDB est 2.6 ou plus récent, il serait préférable de profiter de l'utilisation d'une commande d'écriture API de masse qui permettent l'exécution d'opérations d'insertion en bloc qui sont simplement des abstractions au-dessus du serveur pour faciliter la création d'opérations en bloc et ainsi obtenir des gains de performances avec votre mise à jour sur de grandes collections.

L'envoi des opérations d'insertion en bloc par lots entraîne moins de trafic vers le serveur et effectue ainsi des transactions filaires efficaces en n'envoyant pas tout dans des instructions individuelles, mais plutôt en les divisant en blocs gérables pour l'engagement du serveur. Il y a également moins de temps d'attente pour la réponse dans le rappel avec cette approche.

Ces opérations groupées se présentent principalement sous deux formes :

  • Opérations groupées ordonnées . Ces opérations exécutent toutes les opérations dans l'ordre et génèrent une erreur à la première erreur d'écriture.
  • Opérations groupées non ordonnées . Ces opérations exécutent toutes les opérations en parallèle et agrègent toutes les erreurs. Les opérations en bloc non ordonnées ne garantissent pas l'ordre d'exécution.

Notez que pour les serveurs plus anciens que 2.6, l'API convertira les opérations. Cependant, il n'est pas possible de convertir à 100 %, il peut donc y avoir des cas extrêmes où il ne peut pas rapporter correctement les bons chiffres.

Dans votre cas, vous pouvez implémenter l'opération d'insertion de l'API de transfert en masse par lots de 1 000 comme ceci :

Pour MongoDB 3.2+ en utilisant 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
        });
    }
};

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

Appelez createNewEntries() fonction.

MongoClient.connect(url, function(err, db) {
    createNewEntries(db, entries, function() {
        db.close();
    });
});