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

Come posso migliorare le prestazioni di massa di MongoDB?

Invia le operazioni di inserimento in blocco in batch poiché ciò comporta una minore quantità di traffico verso il server ed esegue quindi 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.

Un approccio molto migliore con questo sarebbe l'utilizzo di async modulo, quindi anche il ciclo dell'elenco di input è un'operazione non bloccante. La scelta della dimensione del batch può variare, ma la selezione delle operazioni di inserimento batch per 1000 voci renderebbe sicuro rimanere al di sotto del limite rigido BSON di 16 MB, poiché l'intera "richiesta" è uguale a un documento BSON.

Di seguito viene illustrato l'utilizzo di async module while per scorrere l'array e chiamare ripetutamente la funzione iteratore, mentre test restituisce true. Richiama la richiamata quando viene interrotta o quando si verifica un errore.

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