Docs Menu
Docs Home
/ /

Reemplazar Documentos

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.

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.

El método replaceOne() acepta los siguientes parámetros:

Parameter
Descripción

filter

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

replacement

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: document: T

options

Opcional. Una instancia de la ReplaceOptions clase que especifica la configuración para la operación de reemplazo. El valor predeterminado null es.

Tipo de dato: Reemplazar opciones

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

bypassDocumentValidation

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

collation

Especifica el tipo de intercalación de idioma que se utilizará al ordenar los resultados.

Tipo de dato: Intercalación

comment

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.

Tipo de dato: Cadena o BsonValue

hint

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

hintString

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

upsert

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

sort

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

let

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

Tras una ejecución exitosa, el método replaceOne() devuelve una instancia UpdateResult. La clase UpdateResult contiene las siguientes propiedades:

Propiedad
Descripción

wasAcknowledged

Indica si MongoDB reconoció o no la operación de reemplazo.

Tipo de dato: boolean

getMatchedCount

La cantidad de documentos que coincidieron con el filtro de consulta, independientemente de si se reemplazó alguno.

Tipo de dato: long

getModifiedCount

El número de documentos reemplazados por la operación de reemplazo.

Tipo de dato: long

getUpsertedId

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

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.

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(
@BsonId 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 }

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. El eq filtro 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 upsert opción establecida true en. 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)

Para obtener más información sobre los métodos y clases utilizados en esta página, consulte la siguiente documentación de API:

Volver

Insertar documentos

En esta página