Overview
En esta guía, puede aprender a modificar documentos en una colección MongoDB utilizando dos tipos de operaciones distintos:
Las operaciones de actualización especifican los campos y valores que se deben cambiar en uno o más documentos. Una operación de reemplazo especifica los campos y valores que se deben reemplazar en un solo documento de la colección.
En los siguientes ejemplos, una tienda de pinturas vende cinco colores diferentes de pintura. paint_inventory La colección representa su inventario actual:
{ "_id": 1, "color": "red", "qty": 5 } { "_id": 2, "color": "purple", "qty": 8 } { "_id": 3, "color": "yellow", "qty": 0 } { "_id": 4, "color": "green", "qty": 6 } { "_id": 5, "color": "pink", "qty": 0 }
Estos datos se modelan con la siguiente clase de datos Kotlin:
data class PaintOrder( val id: Int, val color: String, val qty: Int )
Update
Las operaciones de actualización pueden modificar campos y valores. Aplican los cambios especificados en un documento de actualización a uno o más documentos que coinciden con el filtro de consulta.
La actualizaciónOne()El método cambia el primer documento con el que coincide su filtro de consulta y el método updateMany() cambia todos los documentos con los que coincide su filtro de consulta.
Puede llamar a los métodos updateOne() y updateMany() en una instancia MongoCollection de la siguiente manera:
collection.updateOne(<query>, <updateDocument>) collection.updateMany(<query>, <updateDocument>)
Actualizar parámetros de operación
Los métodos updateOne() y updateMany() tienen ambos los siguientes parámetros:
queryEspecifica un filtro de consulta con los criterios para hacer coincidir los documentos que se actualizarán en su colecciónupdateDocumentEspecifica los campos y valores que se modificarán en el documento o documentos coincidentes. Este ejemplo utiliza el Actualiza los métodos del generador para crear el documento de actualización.(Opcional)
updateOptionsEspecifica opciones que se pueden configurar para personalizar cómo el controlador realiza la operación de actualización. Para obtener más información sobre este tipo, consulte la documentación de la API de UpdateOptions.
Puede crear el updateDocument utilizando un generador Updates de la siguiente manera:
val updateDocument = Updates.operator(<field>, <value>)
Para ver una lista completa de Updates constructores y su uso, consulte Actualizaciones en la documentación de la API.
Actualizar un ejemplo
La tienda de pinturas necesita actualizar su inventario después de que un cliente devuelve una lata de pintura amarilla.
Para actualizar la lata de pintura individual, llame al método updateOne() especificando lo siguiente:
Filtro de consulta que coincide con el color amarillo
Actualizar el documento que contiene instrucciones para incrementar el campo
qtyen1
val filter = Filters.eq(PaintOrder::color.name, "yellow") val update = Updates.inc(PaintOrder::qty.name, 1) val result = collection.updateOne(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 1 Modified document count: 1
Si varios documentos coinciden con el filtro de consulta especificado en el método updateOne(), se actualiza el primer resultado. Puede especificar una ordenación en una instancia UpdateOptions para aplicar un orden a los documentos coincidentes antes de que el controlador realice la operación de actualización, como se muestra en el siguiente código:
val opts = UpdateOptions().sort(Sorts.ascending(PaintOrder::color.name))
Actualizar muchos ejemplos
La tienda de pinturas recibe un nuevo envío y necesita actualizar su inventario. El envío contiene 20 latas de cada color de pintura.
Para actualizar el inventario, llame al método updateMany() especificando lo siguiente:
Filtro de consulta que coincide con todos los colores
Actualizar el documento que contiene instrucciones para incrementar el campo
qtyen20
val filter = Filters.empty() val update = Updates.inc(PaintOrder::qty.name, 20) val result = collection.updateMany(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 5 Modified document count: 5
A continuación se muestran los documentos actualizados en la colección paint_inventory:
{ "_id": 1, "color": "red", "qty": 25 } { "_id": 2, "color": "purple", "qty": 28 } { "_id": 3, "color": "yellow", "qty": 20 } { "_id": 4, "color": "green", "qty": 26 } { "_id": 5, "color": "pink", "qty": 20 }
Si ningún documento coincide con el filtro de consulta en la operación de actualización, updateMany() no realiza cambios en los documentos de la colección.Consulte la guía de Upsert para aprender a insertar un nuevo documento en lugar de actualizarlo si no hay documentos coincidentes.
Importante
Los updateOne() updateMany() métodos y no pueden realizar cambios en un documento que infrinjan las restricciones de índice único de la colección. Consulte el manual del servidor MongoDB para obtener más información sobre índices únicos.
Reemplaza
Una operación de reemplazo sustituye un documento de su colección. La sustitución se produce entre un documento que coincide con el filtro de consulta y un documento de reemplazo.
El método replaceOne() elimina todos los campos y valores existentes en el documento coincidente (excepto el _id campo) y lo sustituye con el documento de reemplazo.
Puede llamar al método replaceOne() en una instancia MongoCollection de la siguiente manera:
collection.replaceOne(<query>, <replacementDocument>)
Reemplazar parámetros de operación
El método replaceOne() tiene los siguientes parámetros:
queryEspecifica un filtro de consulta con los criterios para encontrar un documento que se va a reemplazar en su colecciónreplacementDocumentespecifica los campos y valores de un nuevo objetoDocumentpara reemplazarlo en el documento coincidente(Opcional)
replaceOptionsEspecifica opciones que se pueden configurar para personalizar cómo el controlador realiza la operación de reemplazo. Para obtener más información sobre este tipo, consulte la documentación de la API de "ReplaceOptions".
Reemplazar un ejemplo
La tienda de pinturas se da cuenta de que necesita actualizar su inventario. Lo que creían que eran 20 latas de pintura rosa, en realidad son 25 latas de pintura naranja.
Para actualizar el inventario, llame al método replaceOne() especificando lo siguiente:
Filtro de consulta que coincide con los documentos donde
colores "rosa"Documento de reemplazo donde el
colores "naranja" y elqtyes "25"
val filter = Filters.eq(PaintOrder::color.name, "pink") val update = PaintOrder(5, "orange", 25) val result = collection.replaceOne(filter, update) println("Matched document count: $result.matchedCount") println("Modified document count: $result.modifiedCount")
Matched document count: 1 Modified document count: 1
A continuación se muestra el documento actualizado:
{ "_id": 5, "color": "orange", "qty": 25 }
Si varios documentos coinciden con el filtro de consulta especificado en el método replaceOne(), este reemplaza el primer resultado. Puede especificar una ordenación en una instancia ReplaceOptions para aplicar un orden a los documentos coincidentes antes de que el controlador realice la operación de reemplazo, como se muestra en el siguiente código:
val opts = ReplaceOptions().sort(Sorts.ascending(PaintOrder::color.name))
Si ningún documento coincide con el filtro de consulta en la operación de reemplazo, replaceOne() no realiza cambios en los documentos de la colección.Consulte la guía de Upsert para aprender a insertar un nuevo documento en lugar de reemplazarlo si no hay documentos coincidentes.
Importante
El replaceOne() método no puede realizar cambios en un documento que infrinjan las restricciones de índice único de la colección. Consulte el manual del servidor MongoDB para obtener más información sobre índices únicos.