176 votes

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?

299voto

mdirolf Points 3804

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, vous effectuez une mise à jour multiple en passant true comme quatrième argument à update() , le troisième argument étant l’argument upsert:

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

35voto

user602525 Points 1216

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.

7voto

Tyler Brock Points 9769

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 au préalable.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X