Overview
En esta guía, aprenderá a usar el controlador Kotlin para reemplazar documentos en una colección de MongoDB. Una operación de reemplazo utiliza un filtro de consulta para encontrar un documento en una colección y luego lo reemplaza por uno nuevo.
Reemplazar un documento
El El métodoreplaceOne() elimina todos los campos y valores existentes en el documento coincidente (excepto el _id campo) e inserta los campos y valores del documento de reemplazo.
Puede llamar al método replaceOne() en una instancia MongoCollection de la siguiente manera:
collection.replaceOne(<query>, <replacementDocument>)
Si varios documentos coinciden con el filtro de consulta especificado en el método replaceOne(), la operación 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 inserción y actualización para aprender a insertar un nuevo documento en lugar de reemplazar uno si no hay documentos coincidentes.
Importante
El replaceOne() método no puede realizar cambios en un documento que infrinja las restricciones de índice único de la colección. Consulte el manual de MongoDB Server para obtener más información sobre índices únicos.
Reemplazar parámetros de operación
El método replaceOne() acepta los siguientes parámetros:
Parameter | Descripción |
|---|---|
| Un filtro de consulta que especifica el documento que se va a reemplazar. Para más información sobre los filtros de consulta, consulte el manual de MongoDB Server. Tipo de dato: BSON |
| Un documento de reemplazo, que especifica los campos y valores que se insertarán en el nuevo documento. Si los documentos de su colección están asignados a una clase Kotlin, el documento de reemplazo puede ser una instancia de esta clase. Tipo de dato: |
| Opcional. Una instancia de la Tipo de dato: Reemplazar opciones |
Personalizar la operación de reemplazo
El método replaceOne() acepta opcionalmente un objeto ReplaceOptions como parámetro, que representa opciones que puede utilizar para configurar la operación de reemplazo.
La clase ReplaceOptions contiene las siguientes propiedades:
Propiedad | Descripción |
|---|---|
| Especifica si la operación de reemplazo omite la validación de documentos. Esto permite reemplazar documentos que no cumplen los requisitos de validación del esquema, si los hay. Consulte el manual de MongoDB Server para obtener más información sobre la validación del esquema. Tipo de dato: booleano |
| Especifica el tipo de intercalación de idioma que se utilizará al ordenar los resultados. Tipo de dato: Intercalación |
| Obtiene o establece el comentario proporcionado por el usuario para la operación. Consulte el manual del servidor MongoDB para obtener más información. |
| Obtiene o establece el índice que se usará para buscar documentos. Consulte el manual del servidor MongoDB para obtener más información. Tipo de dato: Bson |
| Obtiene o establece el índice que se usará para buscar documentos. Consulte el manual del servidor MongoDB para obtener más información. Tipo de dato: String |
| Especifica si la operación de reemplazo realiza una operación de upsert si ningún documento coincide con el filtro de consulta. Consulte el manual de MongoDB Server para obtener más información. Tipo de dato: booleano |
| Determina qué documento reemplaza la operación si la consulta selecciona varios documentos, porque la operación de reemplazo reemplaza el primer documento en el orden de clasificación especificado. Tipo de dato: Bson |
| Obtiene o establece el documento let para agregar variables de nivel superior para la operación. Consulte el manual del servidor MongoDB para obtener más información. Tipo de dato: Bson |
Valor de retorno
Tras una ejecución exitosa, el método replaceOne() devuelve una instancia UpdateResult. La clase UpdateResult contiene las siguientes propiedades:
Propiedad | Descripción |
|---|---|
| Indica si MongoDB reconoció o no la operación de reemplazo. Tipo de dato: |
| La cantidad de documentos que coincidieron con el filtro de consulta, independientemente de si se reemplazó alguno. Tipo de dato: |
| El número de documentos reemplazados por la operación de reemplazo. Tipo de dato: |
| El ID del documento que se insertó en la base de datos, si el controlador realizó una inserción. Tipo de dato: Valor de Bson |
Excepciones
Si la operación de reemplazo falla, el controlador genera una excepción.
Por ejemplo, si el valor del campo _id en su documento de reemplazo difiere del valor en el documento original, el método arroja el siguiente MongoWriteException:
After applying the update, the (immutable) field '_id' was found to have been altered to _id: ObjectId('...)
Si el documento de reemplazo contiene un cambio que viola las reglas de índice único, el método arroja un MongoWriteException con un mensaje de error similar al siguiente:
E11000 duplicate key error collection: ...
Para obtener más información sobre los tipos de excepciones generadas en condiciones específicas, consulte la documentación de la API para replaceOne(), cuyo enlace se encuentra en la parte inferior de esta página.
Reemplazar un ejemplo
Una tienda de pinturas vende cinco colores diferentes. Los documentos de la siguiente colección representan los colores de pintura en el inventario de la tienda:
{ "_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": 20 }
La siguiente clase de datos de Kotlin modela estos datos:
data class PaintOrder( val id: Int, val color: String, val qty: Int )
La tienda de pinturas debe actualizar su inventario para reemplazar 20 latas de pintura rosa con 25 latas de pintura naranja.
Para actualizar el inventario, llame al método replaceOne():
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
La operación de reemplazo anterior crea el siguiente documento:
{ "_id": 5, "color": "orange", "qty": 25 }
Ejemplo de reemplazo avanzado
En el siguiente ejemplo, el replaceOne() método reemplaza la primera coincidencia del filtro de consulta en la movies colección del conjunto de datos Atlas sample_mflix.movies con un documento de reemplazo. La operación elimina todos los campos excepto _id del documento original e inserta los campos del documento de reemplazo. La siguiente Movie clase de datos modela los documentos de esta colección para su uso con el controlador Kotlin:
data class Movie( val title: String, val year: Int, val genres: List<String>, val rated: String, val plot: String, val runtime: Int, val imdb: IMDB, val fullplot: String? = "No full plot", ){ data class IMDB( val rating: Double ) }
Tip
Métodos de construcción y propiedades de la clase de datos
Puedes usar los métodos de las clases de constructor directamente con las propiedades de las clases de datos añadiendo la dependencia opcional de extensiones del controlador Kotlin a tu aplicación. Para obtener más información y ver ejemplos, consulta la guía "Usar constructores con clases de datos".
Antes de ejecutar la operación replaceOne(), el documento original contiene varios campos que describen la película. Tras ejecutar la operación, el documento resultante contiene únicamente los campos especificados por el documento de reemplazo (title y fullplot) y el campo _id.
El siguiente ejemplo utiliza los siguientes objetos y métodos:
Un filtro de consulta que se pasa al
replaceOne()método. Eleqfiltro solo encuentra películas cuyo título coincida exactamente con el"Music of the Heart"texto.Un documento de reemplazo que contiene el documento que reemplaza al documento coincidente, si existe.
Un objeto ReplaceOptions con la
upsertopción establecidatrueen. Esta opción especifica que el método inserta los datos del documento de reemplazo si el filtro de consulta no coincide con ningún documento.
Nota
Este ejemplo se conecta a una instancia de MongoDB mediante una URI de conexión. Para obtener más información sobre cómo conectarse a su instancia de MongoDB, consulte la guía de conexión.
import com.mongodb.MongoException import com.mongodb.client.model.Filters import com.mongodb.client.model.ReplaceOptions import com.mongodb.kotlin.client.coroutine.MongoClient import kotlinx.coroutines.runBlocking data class Movie(val title: String, val fullplot: String) fun main() = runBlocking { // Replace the uri string with your MongoDB deployment's connection string val uri = "<connection string uri>" val mongoClient = MongoClient.create(uri) val database = mongoClient.getDatabase("sample_mflix") val collection = database.getCollection<Movie>("movies") try { val query = Filters.eq("title", "Music of the Heart") val replaceDocument = Movie( "50 Violins", " A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music") val options = ReplaceOptions().upsert(true) val result = collection.replaceOne(query, replaceDocument, options) println("Modified document count: " + result.modifiedCount) println("Upserted id: " + result.upsertedId) // only contains a non-null value when an upsert is performed } catch (e: MongoException) { System.err.println("Unable to replace due to an error: $e") } mongoClient.close() }
El ejemplo anterior devuelve el siguiente resultado:
Modified document count: 1 Upserted id: null
Si el ejemplo anterior resultó en una inserción, el código devuelve la siguiente salida:
Modified document count: 0 Upserted id: BsonObjectId{value=...}
Si consulta el documento reemplazado, la consulta devuelve el siguiente resultado:
Movie(title=50 Violins, fullplot= A dramatization of the true story of Roberta Guaspari who co-founded the Opus 118 Harlem School of Music)
Información Adicional
Para obtener más información sobre los métodos y clases utilizados en esta página, consulte la siguiente documentación de API: