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!");
}
);