MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment puis-je améliorer les performances en masse de MongoDB ?

Envoyez les opérations d'insertion en bloc par lots car cela entraîne moins de trafic vers le serveur et effectue ainsi des transactions filaires efficaces en n'envoyant pas tout dans des instructions individuelles, mais plutôt en les divisant en morceaux gérables pour l'engagement du serveur. Il y a également moins de temps à attendre la réponse dans le rappel avec cette approche.

Une bien meilleure approche avec cela serait d'utiliser le async module donc même la boucle de la liste d'entrée est une opération non bloquante. Le choix de la taille du lot peut varier, mais la sélection d'opérations d'insertion par lot pour 1 000 entrées permettrait de rester en toute sécurité sous la limite stricte BSON de 16 Mo, car la "demande" entière est égale à un document BSON.

Ce qui suit montre comment utiliser async module while pour parcourir le tableau et appeler à plusieurs reprises la fonction iterator, tandis que test renvoie true. Rappelle le rappel lorsqu'il est arrêté ou lorsqu'une erreur se produit.

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