Pregunta

Me sorprendí al encontrar que el ejemplo de código siguiente se actualiza sólo 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 mantener la actualización hasta que está todo cambiado, pero que parece terriblemente ineficiente.Hay una manera mejor?

¿Fue útil?

Solución

Actualización de múltiples se ha añadido recientemente, por lo que sólo está disponible en las versiones de desarrollo (1.1.3). Desde el shell que haga una actualización de múltiples pasando true como el cuarto argumento a update(), en el que el tercer argumento es el argumento upsert:

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

Para las versiones de mongodb 2.2+ que necesita para configurar la opción de múltiples fiel a 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 se puede utilizar nuevo método updateMany() actualizar varios documentos a la vez, sin la necesidad de la opción multi separado.

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

Otros consejos

ACTUALIZACIÓN como de V2.2, la función de actualización toma la forma siguiente:

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

La respuesta seleccionada ya no se aplica.

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

versión Mongo> 2.2 , agregue un campo de múltiples y la ponemos a true

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

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

  • db.collection.find({ ... }).update({ ... }) - actualización de múltiples
  • db.collection.find({ ... }).replace({ ... }) - un reemplazo
  • db.collection.find({ ... }).upsert({ ... }) - solo upsert
  • db.collection.find({ ... }).remove() - múltiples remove

También puede aplicar límite, saltar, más o menos a las actualizaciones y elimina encadenándolos de antemano.

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

En el MongoDB Client, tipo:

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

Nuevo en la versión 3.2

Parámetros ::

{}:  select all records updated

Palabra clave argumento multi no se toma

MongoDB encontrará un solo documento coincidente que coincide con los criterios de consulta cuando se está emitiendo un comando de actualización, lo que coincide con el primer documento pasa a ser actualizarse, incluso si hay más documentos que corresponden con los criterios serán ignorados.

de modo de superar esta opción podemos especificar "MULTI" en su instrucción de actualización, lo que significa actualización de todos esos documnets que coincide con los criterios de la consulta. buscará todos los documnets en la recolección de encontrar los que coinciden con los criterios y actualización:

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

Yo tenía el mismo problema , y he encontrado la solución , y funciona como un encanto

sólo tienes que configurar el indicador multi verdadero como este :

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

espero que ayude :)

Puede use.`

        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 () está trabajando bien

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

Gracias por compartir esto, he usado con 2.6.7 y sólo funcionaba siguiente consulta,

para todos los documentos:

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

para sola doc:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top