MongoDB: ¿Cómo actualizar varios documentos con un solo comando?
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?
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 true
como 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 multi
una opción separada.
db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})
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/
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 })