Overview
En esta guía, puedes aprender cómo usar el controlador de Kotlin para reemplazar documentos en una colección de MongoDB. Una operación de reemplazo utiliza un filtro de query para buscar un documento en una colección, luego reemplaza el documento con uno nuevo.
Reemplazar un documento
La 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.
Puedes llamar al método replaceOne() en una instancia de MongoCollection de la siguiente manera:
collection.replaceOne(<query>, <replacementDocument>)
Si varios documentos coinciden con el filtro de query especificado en el método replaceOne(), la operación reemplaza el primer resultado. Puede especificar un orden en una instancia de ReplaceOptions para aplicar un orden a los documentos coincidentes antes de que el controlador ejecute 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 query en la operación de reemplazo, replaceOne() no realiza cambios en los documentos de la colección. Ver el Inserción guía para aprender a insertar un nuevo documento en lugar de reemplazar uno si no se encuentra ningún documento coincidente.
Importante
El método replaceOne() no puede realizar cambios en un documento que viole las restricciones de índice único en la colección. Consulta el manual del servidor MongoDB 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 query que especifica el documento a reemplazar. Para obtener más información sobre los filtros de consulta, consulta el manual de MongoDB Server. Tipo de dato: BSON |
| Un documento de reemplazo, que especifica los campos y valores que se deben insertar en el nuevo documento. Si los documentos de su colección están mapeados a una clase Kotlin, el documento de reemplazo puede ser una instancia de esta clase. Tipo de dato: |
| opcional. Una instancia de la clase Tipo de dato: ReplaceOptions |
Personalizar la operación de reemplazo
El método replaceOne() acepta opcionalmente un objeto ReplaceOptions como parámetro, que representa las opciones que puedes 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 lenguaje que se debe usar al clasificar los resultados. Tipo de dato: Intercalación |
| Obtiene o establece el comentario proporcionado por el usuario para la operación. Para obtener más información, consulta el manual de MongoDB Server. |
| Obtiene o establece el índice que se utilizará para buscar documentos. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: Bson |
| Obtiene o establece el índice que se utilizará para buscar documentos. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: String |
| Especifica si la operación de reemplazo realiza una operación inserción si ningún documentos coincide con el filtro de query. Para obtener más información, consulta el manual de MongoDB Server. Tipo de dato: booleano |
| Determina el documento que la operación reemplaza si la query selecciona múltiples documentos, ya que 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. Consulta 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 query, independientemente de si uno fue reemplazado. Tipo de dato: |
| La cantidad 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: BsonValue |
Excepciones
Si tu operación de sustitución 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 tu documento de reemplazo contiene un cambio que viola las reglas del índice único, el método arroja una 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 de pintura. 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, llama 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 avanzado de sustituir uno
En el siguiente ejemplo, el método replaceOne() reemplaza la primera coincidencia del filtro de query en la colección movies 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 de 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 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.
Antes de que se ejecute la operación replaceOne(), el documento original contiene varios campos que describen la película. Después de que se ejecute la operación, el documento resultante contiene solo 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 sustituye al documento correspondiente, si existe.
Un objeto de ReplaceOptions con la opción
upsertestablecida entrue. Esta opción especifica que el método inserta los datos contenidos en el documento de reemplazo si el filtro de query no coincide con ningún documento.
Nota
Este ejemplo se conecta a una instancia de MongoDB mediante un URI de conexión. Para saber más 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: