Se o seu servidor MongoDB for 2.6 ou mais recente, seria melhor aproveitar os comandos de gravação API em massa que permitem a execução de operações de inserção em massa que são simplesmente abstrações em cima do servidor para facilitar a construção de operações em massa e, assim, obter ganhos de desempenho com sua atualização em grandes coleções.
O envio das operações de inserção em massa em lotes resulta em menos tráfego para o servidor e, portanto, realiza transações de fio eficientes, não enviando tudo em instruções individuais, mas dividindo em partes gerenciáveis para o comprometimento do servidor. Também há menos tempo de espera pela resposta no retorno de chamada com essa abordagem.
Essas operações em massa vêm principalmente em dois sabores:
- Operações em massa encomendadas . Essas operações executam todas as operações em ordem e eliminam o erro no primeiro erro de gravação.
- Operações em massa não ordenadas . Essas operações executam todas as operações em paralelo e agregam todos os erros. As operações em massa não ordenadas não garantem a ordem de execução.
Observe que, para servidores mais antigos que 2.6, a API converterá as operações. No entanto, não é possível converter 100%, portanto, pode haver alguns casos extremos em que não é possível relatar corretamente os números corretos.
No seu caso, você pode implementar a operação de inserção da API em massa em lotes de 1.000 assim:
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();
});
}
};
Chame o
createNewEntries()
função. MongoClient.connect(url, function(err, db) {
createNewEntries(db, entries, function() {
db.close();
});
});