MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como posso melhorar o desempenho em massa do MongoDB?


Envie as operações de inserção em massa em lotes, pois isso resulta em menos tráfego para o servidor e, portanto, executa transações de fio eficientes, não enviando tudo em instruções individuais, mas dividindo em partes gerenciáveis ​​para o compromisso do servidor. Também há menos tempo de espera pela resposta no retorno de chamada com essa abordagem.

Uma abordagem muito melhor com isso seria usar o async módulo, portanto, mesmo fazer um loop na lista de entrada é uma operação sem bloqueio. A escolha do tamanho do lote pode variar, mas a seleção de operações de inserção de lote por 1.000 entradas tornaria seguro ficar abaixo do limite rígido de 16 MB BSON, pois toda a "solicitação" é igual a um documento BSON.

O seguinte demonstra como usar o async module's while iterar pelo array e chamar repetidamente a função iterator, enquanto test retorna true. Chama o retorno de chamada quando parado ou quando ocorre um erro.
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!");
    }
);