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

Mettre à jour tous les éléments d'un tableau dans mongodb

Comme mentionné, le principal problème ici concerne les mises à jour de plusieurs éléments avec l'opérateur positionnel, comme indiqué dans ce problème de longue date :http://jira.mongodb.org/browse/SERVER-1243

Le cas de base est donc qu'aucune exécution unique ne peut le faire, donc pour traiter plusieurs éléments de tableau, vous avez besoin d'une méthode pour déterminer le nombre d'éléments que vous devez mettre à jour et traiter une instruction de mise à jour pour chaque élément.

Une approche simplifiée consiste généralement à utiliser Opérations en masse pour traiter ce qui finit par être des opérations de mise à jour "multiples" comme une seule requête et réponse au serveur :

var bulk = db.collection.initializeOrderedBulkOp(),
    count = 0;

db.collection.find({ "name": "John Doe", "adds.status": "PENDING" }).forEach(function(doc) { 
    doc.adds.filter(function(add){ return add.status = "PENDING" }).forEach(function(add) {
        bulk.find({ "_id": doc._id, "adds.status": "PENDING" }).updateOne({
            "$set": { "adds.$.status": "APPROVED" }
        });
        count++;

        // Execute once in 1000 statements created and re-init
        if ( count % 1000 == 0 ) {
            bulk.execute();
            bulk = db.collection.initializeOrderedBulkOp();
        }
    });
});

// Execute any pending operations
if ( count % 1000 != 0 )
    bulk.execute();

Si vos documents mis à jour sont assez petits, ou même un seul document, vous pouvez renoncer au count vérifiez et ajoutez simplement toutes les mises à jour en bloc dans les boucles requises et exécutez-les une seule fois à la fin de toutes les boucles.

Une explication plus longue et des alternatives peuvent être trouvées sur Comment mettre à jour plusieurs éléments de tableau , mais toutes se résument à des approches différentes pour faire correspondre l'élément à mettre à jour et traiter un positionnel $ mettre à jour plusieurs fois, soit pour chaque document correspondant, soit jusqu'à ce qu'il n'y ait plus de documents modifiés renvoyés.