Overview
En esta guía, puede aprender cómo actualizar documentos en una colección de MongoDB utilizando el updateOne() y updateMany() métodos.
Datos de muestra
Los ejemplos de esta guía ejecutan operaciones en la colección paint_inventory, que almacena documentos que representan los colores de pintura del inventario de una tienda. Esta colección contiene los siguientes documentos de ejemplo:
{ "_id": 1, "color": "red", "qty": 5, "prices": [15.99, 19.99] } { "_id": 2, "color": "purple", "qty": 8, "prices": [18.99, 22.99] } { "_id": 3, "color": "yellow", "qty": 0, "prices": [14.99, 17.99] } { "_id": 4, "color": "green", "qty": 6, "prices": [19.99, 24.99] } { "_id": 5, "color": "blue", "qty": 3, "prices": [17.99, 21.99] }
La siguiente clase de datos de Kotlin modela los documentos de la colección:
data class PaintOrder( val id: Int, val color: String, val qty: Int, val prices: List<Double> )
Ejecutar una operación de actualización
Puede actualizar documentos en MongoDB utilizando los siguientes métodos:
updateOne(), que actualiza el primer documento que coincide con los criterios de búsquedaupdateMany(), que actualiza todos los documentos que coinciden con los criterios de búsqueda
Cada método de actualización requiere los siguientes parámetros:
Filtro de query, que se utiliza para determinar qué documentos se actualizarán. Para aprender más sobre los filtros de query, consulte el Guía 'Especificar una query' .
Documento de actualización, que especifica el operador de actualización o el tipo de actualización que se debe realizar, así como los campos y valores que deben ser actualizados. Para consultar una lista de operadores para actualizar y sus usos, véase la Operadores de actualización de campos en el manual del servidor de MongoDB.
Los ejemplos de esta guía utilizan el generador Updates, una clase de fábrica que proporciona métodos asistente para construir documentos de actualización. Para obtener más información sobre el generador de Updates, consulta la guía desarrolladores de actualizaciones.
Actualizar un documento
Este ejemplo utiliza el método updateOne() para realizar las siguientes acciones:
Coincide con un documento en el que el valor del campo
colores"yellow"Utiliza el generador
Updatespara incrementar el valor del campoqtydel documento que coincide en1
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
Nota
Si varios documentos coinciden con el filtro de query pasado al método updateOne(), la operación actualiza solo el primer resultado. Para controlar con qué documento coincide la operación, puedes especificar un orden de clasificación. Para obtener más información sobre la opción sort, consulta la página Ordenar resultados.
Actualizar muchos documentos
El siguiente ejemplo utiliza el método updateMany() para realizar las siguientes acciones:
Coincide con todos los documentos utilizando un filtro de consulta vacío
Utiliza el generador
Updatespara aumentar el valor del campoqtyen20en todos los documentos coincidentes
val filterMany = Filters.empty() val updateMany = Updates.inc(PaintOrder::qty.name, 20) val resultMany = collection.updateMany(filterMany, updateMany) println("Matched document count: ${resultMany.matchedCount}") println("Modified document count: ${resultMany.modifiedCount}")
Matched document count: 5 Modified document count: 5
Después de la operación de actualización, los documentos en la colección paint_inventory tienen los siguientes valores:
{ "_id": 1, "color": "red", "qty": 25, "prices": [15.99, 19.99] } { "_id": 2, "color": "purple", "qty": 28, "prices": [18.99, 22.99] } { "_id": 3, "color": "yellow", "qty": 20, "prices": [14.99, 17.99] } { "_id": 4, "color": "green", "qty": 26, "prices": [19.99, 24.99] } { "_id": 5, "color": "blue", "qty": 23, "prices": [17.99, 21.99] }
Nota
Si el filtro de query no coincide con ningún documento, el método updateMany() no realiza modificaciones en los documentos de la colección. Puedes usar la opción upsert para insertar un nuevo documento si no hay coincidencias. Para ver un ejemplo que utiliza esta opción, consulta: Insertar o actualizar en una sola operación.
Importante
Los métodos updateOne() y updateMany() no pueden hacer cambios en un documento que violen las restricciones de índices únicos en la colección. Para obtener más información, consulta Índices únicos en el manual del servidor MongoDB.
Actualizar los elementos del arreglo
Para actualizar los valores de un arreglo de un documento, utiliza el generador Updates para especificar la actualización que deseas realizar y los elementos del arreglo a actualizar. Luego, llama al método updateOne() o updateMany() para ejecutar la operación de actualización.
Puede especificar qué elementos de la matriz desea actualizar utilizando los siguientes operadores posicionales:
$: actualiza el primer elemento del arreglo que coincida con el filtro de query.$[]: Actualiza todos los elementos de un arreglo.$[<identifier>]Actualiza los elementos del arreglo que coinciden con un filtro.
Los ejemplos de esta sección muestran cómo usar cada operador posicional.
Actualizar el primer elemento coincidente
Para actualizar el primer elemento del arreglo que coincida con tu filtro de query, utiliza el operador posicional ($) y especifica el campo de arreglo a actualizar en tu filtro de query.
Este ejemplo realiza las siguientes acciones:
Obliga a que el documento tenga un arreglo
pricesque contenga el valor15.99Utiliza el operador posicional
$para incrementar el primer valor del arreglopricesen el documento coincidente por2
val filterArrayFirst = Filters.eq(PaintOrder::prices.name, 15.99) val updateArrayFirst = Updates.inc("${PaintOrder::prices.name}.$", 2) val resultArrayFirst = collection.updateOne(filterArrayFirst, updateArrayFirst) println("Modified document count: ${resultArrayFirst.modifiedCount}")
Modified document count: 1
Actualizar todos los elementos
Para actualizar todos los elementos en un arreglo, utiliza el operador posicional all ($[]).
Este ejemplo realiza las siguientes acciones:
Coincide con un documento que tiene un valor
colorde"green"Usa el operador posicional
$[]para multiplicar todos los valores del arreglopricesdel documento coincide contra1.1