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


145

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 boucler et continuer à mettre à jour jusqu'à ce qu'ils soient tous modifiés, mais cela semble terriblement inefficace. Y a-t-il un meilleur moyen?

Réponses:


247

La mise à jour multiple a été ajoutée récemment, elle n'est donc disponible que dans les versions de développement (1.1.3). Depuis le shell, vous effectuez une mise à jour multiple en passant truecomme quatrième argument à update(), où le troisième argument est 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 pour 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 une nouvelle méthode updateMany()pour mettre à jour plusieurs documents à la fois, sans avoir besoin d' multioption distincte .

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

3
Je ne sais pas quand ce changement s'est produit, mais Mongodb v2.2.2 le fait un peu différemment. db.collection.update (<query>, <update>, <options>) où options est un ensemble de paires valeur / clé. Voir la documentation: docs.mongodb.org/manual/applications/update
TechplexEngineer

3
que faire si je veux définir des valeurs différentes pour un document différent? y a-t-il une manière élégante de faire cela?
zach

Comment faire pour oldvalue + "some string"
Mahesh K

34

À partir de la v3.3, vous pouvez utiliser updateMany

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Dans la v2.2, la fonction de mise à jour prend la forme suivante:

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

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


16

Pour la 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 })

7

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

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

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

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


1
TypeError: db.getCollection (...). Find (...). Update n'est pas une fonction:?
Anthony

n'a pas fonctionné db.userActivity.find({ 'appId' : 1234, 'status' : 1}).update({ $set: { 'status': 1 } }); 2017-06-05T17:47:10.038+0530 E QUERY [thread1] TypeError: db.userActivity.find(...).update is not a function :
Prakash Pandey

4

Dans le client MongoDB, saisissez:

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

Nouveau dans la version 3.2

Paramètres ::

{}:  select all records updated

Argument de mot-clé multinon pris


3

MongoDB ne trouvera qu'un seul document correspondant qui correspond aux critères de requête lorsque vous émettez une commande de mise à jour, le document correspondant en premier à être mis à jour, même s'il y a plus de documents correspondant aux critères, il sera ignoré.

donc pour surmonter cela, nous pouvons spécifier l'option "MULTI" dans votre déclaration de mise à jour, ce qui signifie mettre à jour tous les documnets qui correspondent aux critères de requête. rechercher tous les documnets de la collection pour trouver ceux qui correspondent aux critères et mettre à jour:

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

2

La commande suivante peut mettre à jour plusieurs enregistrements d'une collection

db.collection.update({}, 
{$set:{"field" : "value"}}, 
{ multi: true, upsert: false}
)

1

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

définissez simplement le drapeau multi sur 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

Pour mettre à jour toute la collection,

db.getCollection('collection_name').update({},
{$set: {"field1" : "value1", "field2" : "value2", "field3" : "value3"}},
{multi: true })

0

Vous pouvez utiliser. »

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  `

0

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

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

-1

Merci de partager cela, j'ai utilisé avec 2.6.7 et la requête suivante vient de fonctionner,

pour tous les documents:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

pour un seul document:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.