Question

Je fus surpris de constater que le code exemple suivant met à jour 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 boucle à travers et continuer la mise à jour jusqu'à ce qu'ils soient tous changés, mais cela semble terriblement inefficace. Y at-il une meilleure façon?

Était-ce utile?

La solution

Mise à jour multi a été ajouté récemment, donc est uniquement disponible dans les versions de développement (1.1.3). À partir du shell que vous faites une mise à jour à plusieurs en passant true comme le 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 de mettre à jour plusieurs cas de 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 nouvelle méthode updateMany() de mettre à jour plusieurs documents à la fois, sans avoir besoin d'option multi séparée.

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

Autres conseils

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

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

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

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

Version mongo> 2.2 , ajoutez un champ à plusieurs et le mettre à true

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

J'ai créé une façon de le faire avec une meilleure interface.

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

Vous pouvez également appliquer la limite, sauter, trier les mises à jour et supprime en les enchaînant à l'avance.

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

Dans le client MongoDB, tapez:

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

Nouveau dans la version 3.2

params ::

{}:  select all records updated

argument de mots-clés multi pas pris

MongoDB trouverez un seul document correspondant qui correspond aux critères de recherche lorsque vous émettez une commande de mise à jour, quel que soit le document correspond à la première arrive à se mettre à jour, même s'il y a plus de documents correspondant aux critères seront ignorés.

pour surmonter cela, nous pouvons spécifier l'option « MULTI » dans votre déclaration de mise à jour, ce qui signifie la mise à jour toutes les documnets qui correspond aux critères de recherche. rechercher tous les documnets dans la collection de trouver celles qui correspondent aux critères et mise à jour:

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

J'ai eu le même problème, et je l'ai trouvé la solution, et il fonctionne comme un charme

vient de mettre le drapeau à plusieurs vrai comme ceci:

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

J'espère que cela:)

Vous pouvez use.`

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

Toutes les dernières versions de MongoDB updateMany () fonctionne bien

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

Merci de partager, j'utilisé avec 2.6.7 et requête suivante juste travaillé,

pour tous les docs:

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

pour seul doc:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top