Overview
En esta guía, puedes aprender cómo especificar actualizaciones utilizando desarrolladores en el MongoDB Kotlin Driver.
La Updates builder proporciona métodos de asistente para los siguientes tipos de actualizaciones:
Algunos métodos que esperan actualizaciones son:
updateOne()updateMany()bulkWrite()
La clase Updates proporciona métodos de fábrica estáticos para todos los operadores de actualización de MongoDB. Cada método devuelve una instancia del tipo BSON, que puede pasar a cualquier método que espere un argumento de actualización.
Tip
Para abreviar, puedes optar por importar los métodos de la clase Actualizaciones:
import com.mongodb.client.model.Updates.*
Los ejemplos de esta guía utilizan el siguiente documento:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Este ejemplo se modela según la siguiente clase de datos, a menos que se indique lo contrario:
data class PaintOrder ( val id: Int, val color: String, val qty: Int?, val vendor: List<Vendor>?, val lastModified: LocalDateTime? ) data class Vendor ( val name: String, )
Tip
Métodos de desarrolladores y propiedades de clases de datos
Puedes utilizar los métodos de las clases builder directamente con las propiedades de la data class añadiendo la dependencia opcional de extensiones del driver de Kotlin a tu aplicación. Para obtener más información y ver ejemplos, consulta la guía Utilizar desarrolladores con clases de datos.
Actualizaciones de campo
Configura
Utiliza el método set() para asignar el valor de un campo en una operación de actualización.
El siguiente ejemplo establece el valor del campo qty en 11:
val filter = Filters.eq("_id", 1) val update = Updates.set(PaintOrder::qty.name, 11) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 11, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Sin establecer
Utiliza el método unset() para borrar el valor de un campo en una operación de actualización.
El siguiente ejemplo elimina el campo qty:
val filter = Filters.eq("_id", 1) val update = Updates.unset(PaintOrder::qty.name) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Configurar al insertar
Utiliza el método setOnInsert() para asignar el valor de un campo en una operación de actualización durante la inserción de un documento.
El siguiente ejemplo establece el valor del campo color en "pink" si la operación resultó en la inserción de un documento:
val filter = Filters.eq("_id", 1) val update = Updates.setOnInsert(PaintOrder::color.name, "pink") collection.updateOne(filter, update, UpdateOptions().upsert(true))
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "pink" }
Nota
Si el documento no se inserta, no se producirá ningún cambio.
Incremento
Usa el inc() método para incrementar el valor de un campo numérico en una operación de actualización.
El siguiente ejemplo incrementa el valor del campo qty, que era 5, en 3:
val filter = Filters.eq("_id", 1) val update = Updates.inc(PaintOrder::qty.name, 3) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 8, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Multiplicar
Utiliza el método mul() para multiplicar el valor de un campo numérico en una operación de actualización.
El siguiente ejemplo multiplica el valor del campo qty, que era 5, por 2:
val filter = Filters.eq("_id", 1) val update = Updates.mul(PaintOrder::qty.name, 2) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 10, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
renombrar
Utiliza el método rename() para cambiar el valor de un campo en una operación de actualización.
El siguiente ejemplo cambia el nombre del campo qty a quantity:
val filter = Filters.eq("_id", 1) val update = Updates.rename(PaintOrder::qty.name, "quantity") collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" }, "quantity": 5, }
Min
Utiliza el método min() para establecer el valor del campo al valor dado si este es menor que el valor actual del campo.
El siguiente ejemplo actualiza el campo qty a 2 porque 2 es menor que el valor actual del campo qty (5):
val filter = Filters.eq("_id", 1) val update = Updates.min(PaintOrder::qty.name, 2) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 2, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
máximo
Utilice el método max() para actualizar el valor de un campo con el número mayor de los dos especificados en una operación de actualización.
El siguiente ejemplo actualiza el campo qty a 8 porque 8 es mayor que el valor actual del campo qty (5):
val filter = Filters.eq("_id", 1) val update = Updates.max(PaintOrder::qty.name, 8) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 8, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Fecha actual
Utilizar el método currentDate() para asignar a un campo el valor de la fecha actual en una operación de actualización como fecha BSON.
El siguiente ejemplo configura el valor del campo lastModified a la fecha actual como una fecha BSON:
val filter = Filters.eq("_id", 1) val update = Updates.currentDate(PaintOrder::lastModified.name) collection.updateOne(filter, update)
Desde que escribimos esta página el 16 de junio de 2023, el ejemplo anterior actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "$date": "2023-06-16T17:13:06.373Z" }
Marca de tiempo actual
Utiliza el método currentTimestamp() para asignar el valor de un campo en una operación de actualización a la fecha actual, como un timestamp.
El siguiente ejemplo establece el valor del campo lastModified a la fecha actual como una marca de tiempo BSON:
// Create a new instance of the collection with the flexible `Document` type // to allow for the changing of the `lastModified` field to a `BsonTimestamp` // from a `LocalDateTime`. val collection = database.getCollection<Document>("paint_orders") val filter = Filters.eq("_id", 1) val update = Updates.currentTimestamp(PaintOrder::lastModified.name) collection.updateOne(filter, update)
Desde que escribimos esta página el 16 de junio de 2023, el ejemplo anterior actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "$timestamp": { "t": 1686935654, "i": 3 } }
Bit
Usa los bitwiseOr(), bitwiseAnd() y bitwiseXor() métodos para realizar una actualización bit a bit del valor entero de un campo en una operación de actualización.
El siguiente ejemplo realiza una operación bit a bit OR entre el número 10 y el valor entero del campo qty (5):
val filter = Filters.eq("_id", 1) val update = Updates.bitwiseOr(PaintOrder::qty.name, 10) collection.updateOne(filter, update)
La operación bit a bit da como resultado 15:
0101 // bit representation of 5 1010 // bit representation of 10 ---- 1111 // bit representation of 15
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 15, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Array Updates
Añadir al conjunto
Utiliza el método addToSet() para añadir un valor a un arreglo si el valor no está ya presente en una operación de actualización.
El siguiente ejemplo añade una instancia de Vendor que tiene un valor de name de "C" al arreglo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.addToSet(PaintOrder::vendor.name, Vendor("C")) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "C" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Pop
Utiliza el método popFirst() para remover el primer elemento de un arreglo y el método popLast() para remover el último elemento de un arreglo en una operación de actualización.
El siguiente ejemplo remueve la primera entrada del arreglo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.popFirst(PaintOrder::vendor.name) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "D" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Extraer todo
Utiliza el método pullAll() para remover todas las instancias de valores especificados de un arreglo existente en una operación de actualización.
El siguiente ejemplo remueve Vendor instancias que tienen name valores de "A" y "M" del arreglo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.pullAll(PaintOrder::vendor.name, listOf(Vendor("A"), Vendor("M"))) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "D" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Tirar
Usa el método pull() para remover todas las instancias de un valor especificado de un arreglo existente en una operación de actualización.
El siguiente ejemplo elimina Vendor instancias que tienen un valor name de "D" del arreglo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.pull(PaintOrder::vendor.name, Vendor("D")) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "M" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Push
Utilice el método push() para agregar un valor a un arreglo en una operación de actualización.
El siguiente ejemplo añade una instancia de Vendor que tiene un valor de name de "Q" al arreglo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.push(PaintOrder::vendor.name, Vendor("Q")) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "red", "qty": 5, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "Q" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }
Combinando múltiples operadores de actualización
Una aplicación puede actualizar varios campos de un solo documento combinando dos o más de los operadores de actualización descritos en las secciones anteriores.
El siguiente ejemplo aumenta el valor del campo qty en 6, asigna el valor del campo color a "purple" y añade una instancia Vendor que tiene un valor name de "R" al campo vendor:
val filter = Filters.eq("_id", 1) val update = Updates.combine( Updates.set(PaintOrder::color.name, "purple"), Updates.inc(PaintOrder::qty.name, 6), Updates.push(PaintOrder::vendor.name, Vendor("R")) ) collection.updateOne(filter, update)
El ejemplo precedente actualiza el documento original al siguiente estado:
{ "_id": 1, "color": "purple", "qty": 11, "vendor": [ { "name": "A" }, { "name": "D" }, { "name": "M" }, { "name": "R" } ], "lastModified": { "$date": "2000-01-01T07:00:00.000Z" } }