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

Me sorprendió descubrir que el siguiente código de ejemplo solo actualiza un solo 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 seguir y seguir actualizando hasta que todos hayan cambiado, pero eso parece terriblemente ineficiente. ¿Hay 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 intérprete de órdenes, realiza una actualización múltiple pasando true como el cuarto argumento para 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 establecer la opción multi verdadero 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 usar el nuevo método updateMany() para actualizar varios documentos a la vez, sin la necesidad de multi opción multi separada.

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

ACTUALIZAR a partir de V2.2, la función de actualización toma la siguiente forma:

  db.collection.update( , , { upsert: , multi:  } ) 

La respuesta seleccionada ya no se aplica.

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

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

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

He creado una forma de hacer esto con una mejor interfaz.

  • db.collection.find({ ... }).update({ ... }) – actualización múltiple
  • db.collection.find({ ... }).replace({ ... }) – reemplazo único
  • db.collection.find({ ... }).upsert({ ... }) – upsert simple
  • db.collection.find({ ... }).remove() – multi remove

También puede aplicar limit, skip, sort a las actualizaciones y eliminar encadenándolas de antemano.

Si estás interesado, echa un vistazo a Mongo-Hacker

MongoDB encontrará solo un documento coincidente que coincida con los criterios de consulta cuando se está emitiendo un comando de actualización, el que coincida con el primero se actualice, incluso si hay más documentos que coinciden con los criterios se ignorarán.

para superar esto podemos especificar la opción “MULTI” en su statement de actualización, es decir, actualizar todos los documnets que coincidan con los criterios de consulta. escanee todos los documnets en la colección encontrando los que coinciden con los criterios y actualice:

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

En el cliente MongoDB, escriba:

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

Nuevo en la versión 3.2

Params ::

 {}: select all records updated 

Palabra clave argumento multi no tomada

Tuve el mismo problema, y ​​encontré la solución, y funciona como un encanto

simplemente configure el indicador multi como verdadero:

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

Espero que eso ayude 🙂

Puedes usar.

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

Todas las últimas versiones de mongodb updateMany () funcionan bien

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

Para las versiones de mongodb 3.2+, puede usar el método updateMany () para actualizar varios documentos

 db.documentName.updateMany({"conditionFiledName":"value"}, {$set: {fieldName1: value1,fieldName2: value2}}) 

Gracias por compartir esto, lo utilicé con 2.6.7 y la siguiente consulta acaba de funcionar,

para todos los documentos:

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

para solo documento:

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