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

¿Cómo puedo mejorar el rendimiento masivo de MongoDB?

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

Un enfoque mucho mejor con esto sería usar el async módulo por lo que incluso hacer un bucle en la lista de entrada es una operación sin bloqueo. La elección del tamaño del lote puede variar, pero la selección de operaciones de inserción por lotes por cada 1000 entradas haría que fuera seguro mantenerse por debajo del límite estricto de 16 MB de BSON, ya que toda la "solicitud" equivale a un documento BSON.

A continuación se muestra el uso de async module's while para iterar a través de la matriz y llamar repetidamente a la función iteradora, mientras que la prueba devuelve verdadero. Devuelve la llamada cuando se detiene o cuando se produce un error.

var bulk = col.initializeOrderedBulkOp(),
    counter = 0,
    len = array.length,
    buildModel = function(index){   
        return {
            "data": array[index],
            "metaData": {
                "hash": hash,
                "date": timestamp,
                "name": name
            }
        }
    };

async.whilst(
    // Iterator condition
    function() { return counter < len },

    // Do this in the iterator
    function (callback) {
        counter++;
        var model = buildModel(counter);
        bulk.insert(model);

        if (counter % 1000 == 0) {
            bulk.execute(function(err, result) {
                bulk = col.initializeOrderedBulkOp();
                callback(err);
            });
        } else {
            callback();
        }
    },

    // When all is done
    function(err) {
        if (counter % 1000 != 0) {
            bulk.execute(function(err, result) {
                console.log("More inserts.");
            }); 
        }           
        console.log("All done now!");
    }
);