sql >> Base de Datos >  >> NoSQL >> MongoDB

Forma correcta de insertar muchos registros en Mongodb con Node.js

Si su servidor MongoDB es 2.6 o más nuevo, sería mejor aprovechar el uso de comandos de escritura API masiva que permiten la ejecución de operaciones de inserción masiva que son simplemente abstracciones en la parte superior del servidor para facilitar la creación de operaciones masivas y, por lo tanto, obtener ganancias de rendimiento con su actualización en colecciones grandes.

El envío de operaciones de inserción masiva en lotes da como resultado menos tráfico al servidor y, por lo tanto, realiza transacciones electrónicas eficientes al no enviar todo en extractos individuales, sino dividirlo en fragmentos manejables para el compromiso del servidor. También hay menos tiempo esperando la respuesta en la devolución de llamada con este enfoque.

Estas operaciones masivas vienen principalmente en dos sabores:

  • Operaciones masivas ordenadas . Estas operaciones ejecutan todas las operaciones en orden y fallan en el primer error de escritura.
  • Operaciones masivas desordenadas . Estas operaciones ejecutan todas las operaciones en paralelo y agregan todos los errores. Las operaciones masivas no ordenadas no garantizan el orden de ejecución.

Tenga en cuenta que para servidores anteriores a 2.6, la API convertirá las operaciones a una escala inferior. Sin embargo, no es posible realizar una conversión descendente del 100 %, por lo que puede haber algunos casos extremos en los que no pueda informar correctamente los números correctos.

En su caso, podría implementar la operación de inserción de API masiva en lotes de 1000 como este:

Para MongoDB 3.2+ usando 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
        });
    }
};

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

Llame a createNewEntries() función.

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