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

Est-ce un moyen sûr d'insérer et de mettre à jour un tableau d'objets dans mongodb ?

Utilisation du bulkWrite L'API pour effectuer les mises à jour gère mieux cela

mongodb.connect(mongo_url, function(err, db) {
    if(err) console.log(err)
    else {
        var mongo_products_collection = db.collection("products")

        mongoUpsert(mongo_products_collection, data_products, function() {
            db.close()
        })
    }
})

function mongoUpsert(collection, data_array, cb) {

    var bulkUpdateOps = data_array.map(function(data) {
        return {
            "updateOne": {
                "filter": { 
                    "product_id": data.product_id,
                    "post_modified": { "$ne": data.post_modified }
                },
                "update": { "$set": data },
                "upsert": true
            }
        };
    });

    collection.bulkWrite(bulkUpdateOps, function(err, r) {
        // do something with result
    });

    return cb(false);
}

Si vous avez affaire à des tableaux plus grands, c'est-à-dire> 1000, envisagez d'envoyer les écritures au serveur par lots de 500, ce qui vous donne de meilleures performances car vous n'envoyez pas toutes les requêtes au serveur, une seule fois toutes les 500 requêtes.

Pour les opérations en masse, MongoDB impose une limite interne par défaut de 1000 opérations par lot et donc le choix de 500 documents est bon dans le sens où vous avez un certain contrôle sur la taille du lot plutôt que de laisser MongoDB imposer la valeur par défaut, c'est-à-dire pour des opérations plus importantes de l'ordre de> 1000 documents. Donc, pour le cas ci-dessus dans la première approche, on pourrait simplement écrire tout le tableau à la fois car c'est petit mais le choix 500 est pour les tableaux plus grands.

var ops = [],
    counter = 0;

data_array.forEach(function(data) {
    ops.push({
        "updateOne": {
            "filter": { 
                "product_id": data.product_id, 
                "post_modified": { "$ne": data.post_modified } 
            },
            "update": { "$set": data },
            "upsert": true
        }
    });
    counter++;

    if (counter % 500 == 0) {
        collection.bulkWrite(ops, function(err, r) {
            // do something with result
        });
        ops = [];
    }
})

if (counter % 500 != 0) {
    collection.bulkWrite(ops, function(err, r) {
        // do something with result
    }
}