web-dev-qa-db-fra.com

MongoDB: Comment mettre à jour plusieurs documents avec une seule commande?

J'ai été surpris de constater que l'exemple de code suivant ne met à jour qu'un seul document:

> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});

> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});

> db.test.find({"test":"success!"}).count();
1

Je sais que je peux suivre en boucle les mises à jour jusqu'à ce qu'elles soient toutes modifiées, mais cela semble terriblement inefficace. Y a-t-il un meilleur moyen?

98
Luke Dennis

La mise à jour multiple a été ajoutée récemment, elle est donc uniquement disponible dans les versions de développement (1.1.3). Depuis le shell, effectuez une mise à jour multiple en passant true en tant que quatrième argument à update(), le troisième argument étant l'argument upsert:

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);

Pour les versions de mongodb 2.2+, vous devez définir l'option multi true afin de mettre à jour plusieurs documents à la fois.

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

Pour les versions de mongodb 3.2+, vous pouvez également utiliser la nouvelle méthode updateMany() pour mettre à jour plusieurs documents à la fois, sans avoir besoin de l'option multi séparée.

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
175
mdirolf

UPDATE à partir de la V2.2, la fonction de mise à jour prend la forme suivante:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

La réponse sélectionnée ne s'applique plus.

https://docs.mongodb.com/manual/reference/method/db.collection.update/

31
user602525

Pour version Mongo> 2.2 , ajoutez un champ multi et définissez-le sur true

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })
12
Kartik Singh

J'ai créé un moyen de faire cela avec une meilleure interface.

  • db.collection.find({ ... }).update({ ... }) - mise à jour multiple
  • db.collection.find({ ... }).replace({ ... }) - remplacement simple
  • db.collection.find({ ... }).upsert({ ... }) - single upsert
  • db.collection.find({ ... }).remove() - multi remove

Vous pouvez également appliquer une limite, ignorer, trier les mises à jour et les supprimer en les chaînant préalablement.

Si vous êtes intéressé, consultez Mongo-Hacker

8
Tyler Brock

MongoDB ne trouvera qu'un seul document correspondant qui correspond aux critères de la requête lorsque vous émettez une commande de mise à jour, le premier des documents correspondants étant mis à jour en premier, même s'il existe d'autres documents correspondant aux critères qui seront ignorés.

pour surmonter ce problème, nous pouvons spécifier l’option "MULTI" dans votre instruction de mise à jour, ce qui signifie mettre à jour tous les documents qui correspondent aux critères de la requête. recherche tous les documents de la collection en recherchant ceux qui correspondent aux critères et les met à jour:

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )
3

Dans le client MongoDB, tapez: 

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

Nouveau dans la version 3.2

Paramètres ::

{}:  select all records updated

Argument de mot clé multi non pris

3
Boseam

J'ai eu le même problème, et j'ai trouvé la solution, et ça marche comme un charme

il suffit de mettre le drapeau multi à true comme ceci:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

j'espère que ça aide :)

1
Amine_Dev

Vous pouvez utiliser. 

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `
0
Jitendra

Pour les versions de mongodb 3.2+, vous pouvez utiliser la méthode updateMany () pour mettre à jour plusieurs documents.

http://answerexpress.blogspot.com/2018/09/mongodb-how-to-update-multiple.html

0
Sunil Jose

Toutes les dernières versions de mongodb updateMany () fonctionne correctement

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});
0
KARTHIKEYAN.A