MongoDB: ¿Cómo actualizar varios documentos con un solo comando?

Resuelto Luke Dennis asked hace 15 años • 13 respuestas

Me sorprendió descubrir que el siguiente código de ejemplo solo actualiza un único documento:

> 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

Sé que puedo recorrer y seguir actualizando hasta que todos hayan cambiado, pero eso parece terriblemente ineficiente. ¿Existe una mejor manera?

Luke Dennis avatar Nov 16 '09 11:11 Luke Dennis
Aceptado

La actualización múltiple se agregó recientemente, por lo que solo está disponible en las versiones de desarrollo (1.1.3). Desde el shell, realiza una actualización múltiple pasando truecomo cuarto argumento a update(), donde el tercer argumento es el argumento upsert:

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

Para las versiones de mongodb 2.2+, debe configurar la opción multi true para actualizar varios documentos a la vez.

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

Para las versiones de mongodb 3.2+, también puede utilizar un nuevo método updateMany()para actualizar varios documentos a la vez, sin la necesidad de multiuna opción separada.

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
mdirolf avatar Nov 16 '2009 05:11 mdirolf

A partir de v3.3 puedes usar updateMany

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

En v2.2, la función de actualización toma la siguiente forma:

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

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

user602525 avatar Dec 16 '2013 05:12 user602525

Para la versión de Mongo > 2.2 , agregue un campo multi y configúrelo en verdadero

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })
zero avatar Oct 30 '2014 06:10 zero