MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Modo corretto per inserire molti record in Mongodb con Node.js

Se il tuo server MongoDB è 2.6 o successivo, sarebbe meglio sfruttare i comandi di scrittura API in blocco che consentono l'esecuzione di operazioni di inserimento in blocco che sono semplicemente astrazioni sulla parte superiore del server per semplificare la creazione di operazioni in blocco e quindi ottenere miglioramenti delle prestazioni con l'aggiornamento su raccolte di grandi dimensioni.

L'invio delle operazioni di inserimento in blocco in batch comporta una minore quantità di traffico al server e quindi esegue transazioni di trasferimento efficienti non inviando tutto in singole istruzioni, ma piuttosto suddividendo in blocchi gestibili per l'impegno del server. C'è anche meno tempo in attesa della risposta nella richiamata con questo approccio.

Queste operazioni sfuse sono disponibili principalmente in due gusti:

  • Operazioni in blocco ordinate . Queste operazioni eseguono tutte le operazioni in ordine ed escono dal primo errore di scrittura.
  • Operazioni in blocco non ordinate . Queste operazioni eseguono tutte le operazioni in parallelo e aggregano tutti gli errori. Le operazioni in blocco non ordinate non garantiscono l'ordine di esecuzione.

Nota, per i server più vecchi di 2.6 l'API eseguirà il downconvert delle operazioni. Tuttavia non è possibile effettuare una conversione al 100%, quindi potrebbero esserci alcuni casi limite in cui non è possibile riportare correttamente i numeri corretti.

Nel tuo caso, potresti implementare l'operazione di inserimento dell'API in blocco in batch di 1000 come questo:

Per MongoDB 3.2+ utilizzando 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
        });
    }
};

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

Chiama il createNewEntries() funzione.

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