Puede reemplazar un solo documento utilizando el replaceOne() Método en un objeto MongoCollection. Este método elimina todos los campos y valores existentes de un documento (excepto el campo _id) y lo sustituye por el documento de reemplazo.
El método replaceOne() acepta un filtro de consulta que coincide con el documento que desea reemplazar y un documento de reemplazo que contiene los datos que desea guardar en lugar del documento coincidente. El método replaceOne() solo reemplaza el primer documento que coincide con el filtro.
Opcionalmente, puede pasar una instancia de ReplaceOptions al método replaceOne() para especificar su comportamiento. Por ejemplo, si establece el campo upsert del objeto ReplaceOptions como true, la operación insertará un nuevo documento a partir de los campos del documento de reemplazo si ningún documento coincide con el filtro de consulta. Consulte el enlace a la documentación de la API ReplaceOptions al final de esta página para obtener más información.
Tras una ejecución correcta, el método replaceOne() devuelve una instancia de UpdateResult. Puede recuperar información como el número de documentos modificados llamando al método getModifiedCount(). También puede recuperar el valor del campo _id del documento llamando al método getUpsertedId() si estableció upsert(true) en la instancia ReplaceOptions y la operación resultó en la inserción de un nuevo documento.
Si la operación de reemplazo falla, el controlador genera una excepción. Por ejemplo, si intenta especificar un valor para el campo inmutable _id en el documento de reemplazo que difiere del documento original, el método genera una excepción MongoWriteException con el mensaje:
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 que debería verse así:
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.
Ejemplo
En este ejemplo, reemplazamos la primera coincidencia de nuestro filtro de query en la colección movies de la base de datos sample_mflix con un documento de reemplazo. Todos los campos excepto para el campo _id se borran del documento original y son sustituidos por el documento de reemplazo.
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 fragmento 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 reemplazará al documento coincidente si existe.
Un objeto ReplaceOptions con la
upsertopción establecidatrueen. Esta opción especifica que el método debe insertar 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 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() }
Después de ejecutar el ejemplo, debería ver un resultado parecido a esto:
Modified document count: 1 Upserted id: null
O si el ejemplo resultó en una inserción y actualización:
Modified document count: 0 Upserted id: BsonObjectId{value=...}
Si consulta el documento reemplazado, debería verse así:
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 información adicional sobre las clases y métodos mencionados en esta página, consulte la siguiente documentación de API: