Cómo limitar el número de documentos de actualización en mongodb

¿Cómo implementar algo similar a db.collection.find().limit(10) pero al actualizar documentos?

Ahora estoy usando algo realmente malo como obtener documentos con db.collection.find().limit() y luego actualizarlos.

En general, quiero devolver una determinada cantidad de registros y cambiar un campo en cada uno de ellos.

Gracias.

Lamentablemente, la solución que tiene es la única forma de hacerlo AFAIK. Hay un marcador booleano multi que actualizará todas las coincidencias (cuando sea true ) o actualizará el 1er partido (cuando sea false ).

Puedes usar:

 db.collection.find().limit(NUMBER_OF_ITEMS_YOU_WANT_TO_UPDATE).forEach( function (e) { e.fieldToChange = "blah"; .... db.collection.save(e); } ); 

(Créditos para forCada código: MongoDB: Actualización de documentos utilizando datos del mismo documento )

Lo que esto hará solo cambiará la cantidad de entradas que especifique. Por lo tanto, si desea agregar un campo llamado “newField” con valor 1 a solo la mitad de sus entradas dentro de “collection”, por ejemplo, puede agregar

 db.collection.find().limit(db.collection.count() / 2).forEach( function (e) { e.newField = 1; db.collection.save(e); } ); 

Si luego quiere hacer que la otra mitad también tenga “newField” pero con el valor 2, puede hacer una actualización con la condición de que newField no exista:

 db.collection.update( { newField : { $exists : false } }, { $set : { newField : 2 } }, {multi : true} ); 

Las soluciones que iteran sobre todos los objetos y luego las actualizan individualmente son muy lentas.

Recuperarlos a todos y actualizarlos simultáneamente usando $in es más eficiente.

 ids = People.where(firstname: 'Pablo').limit(10000).only(:_id).to_a.map(&:id) People.in(_id: ids).update_all(lastname: 'Cantero') 

La consulta está escrita usando Mongoid, pero también se puede reescribir fácilmente en Mongo Shell.

Usar forEach para actualizar individualmente cada documento es lento. Puede actualizar los documentos a granel usando

 ids = db.collection.find().limit().map( function(doc) { return doc._id; } ); db.collection.updateMany({_id: {$in: ids}}, }) 

Como dice la respuesta, todavía no hay forma de limitar el número de documentos para actualizar (o eliminar) a un valor> 1. Una solución para usar algo como:

 db.collection.find().limit().forEach(function(doc){db.collection.update({_id:doc._id},{})}) 

No estoy seguro de cuál es el propósito de aplicar un límite a las actualizaciones (ni siquiera es posible en SQL). Como lobster worte: la actualización funciona solo en un documento o en todos los documentos que coinciden con los criterios de actualización. Por lo tanto, debe ajustar los criterios según sus necesidades o actualizar uno por uno según una consulta anterior.