Overview
En esta guía, puedes aprender cómo utilizar el Rust driver para reemplazar documentos en una colección de MongoDB utilizando el replace_one() .
Las operaciones de reemplazo eliminan todos los campos existentes de un documento, excepto el campo _id, y sustituyen los campos eliminados por nuevos campos y valores.
Nota
Para aprender a actualizar campos específicos en documentos, consulta el Actualizar Documentos guía.
Esta guía incluye las siguientes secciones:
Reemplazar un documento describe cómo usar el controlador para ejecutar operaciones de reemplazo
Modificar el comportamiento de reemplazo describe cómo modificar el comportamiento por defecto del método
replace_one()Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía
El campo _id
Cada documento en una colección de MongoDB tiene un campo único e inmutable _id. Si intenta cambiar el campo _id mediante una operación de reemplazo, el controlador generará un WriteError y no realizará ninguna actualización.
Reemplazar un documento
Puedes realizar una operación de reemplazo con el método replace_one(). Este método remueve todos los campos existentes de un documento excepto el campo _id y sustituye los campos eliminados por nuevos campos y valores que usted especifique.
También puedes encadenar métodos desarrolladores de opciones al método replace_one(). Para aprender a modificar el comportamiento de este método, consulta la sección Modificar el comportamiento de reemplazo de esta guía.
Tip
Puede recuperar y modificar datos en una sola acción utilizando operaciones compuestas. Para obtener más información, consulta la guía sobre Operaciones Compuestas.
Parámetros
El método replace_one() acepta los siguientes parámetros:
Filtro de query para hacer coincidir el documento a reemplazar
Documentos de reemplazo que contienen los campos y valores que reemplazarán a un documento existente
Los documentos de reemplazo usan el siguiente formato:
doc! { "<field>": <value>, "<field>": <value>, ... }
Valor de retorno
El método replace_one() devuelve un tipo UpdateResult si la operación es exitosa. El tipo UpdateResult contiene las siguientes propiedades que describen la operación:
Propiedad | Descripción |
|---|---|
| El número de documentos que coinciden con el filtro |
| El número de documentos modificados por la operación |
| El |
Si varios documentos coinciden con el filtro de query que pasas a replace_one(), el método selecciona y reemplaza el primer documento que coincida. Si ningún documento coincide con el filtro de query, la operación de reemplazo no realiza ningún cambio.
Ejemplos
Esta sección proporciona ejemplos que demuestran cómo utilizar el método replace_one() para reemplazar documentos en una colección.
Ejemplo de reemplazo
El siguiente documento describe a un empleado de una empresa:
{ "_id": ObjectId('4501'), "name": "Matt DeGuy", "role": "Consultant", "team_members": [ "Jill Gillison", "Susan Lee" ] }
Este ejemplo utiliza el método replace_one() para reemplazar el documento anterior con uno que tenga los siguientes campos:
Un valor
namede"Susan Lee"Un valor
rolede"Lead Consultant"Un valor
team_membersde[ "Jill Gillison" ]
let replace_doc = doc! { "name": "Susan Lee", "role": "Lead Consultant", "team_members": vec! [ "Jill Gillison" ] }; let res = my_coll .replace_one(doc! { "name": "Matt DeGuy" }, replace_doc) .await?; println!( "Matched documents: {}\nModified documents: {}", res.matched_count, res.modified_count );
Matched documents: 1 Modified documents: 1
El documento reemplazado contiene el contenido del documento de reemplazo y el campo inmutable _id:
{ "_id": ObjectId('4501'), "name": "Susan Lee", "role": "Lead Consultant", "team_members": [ "Jill Gillison" ] }
Ejemplo de archivo completo: sustituir un documento
Este ejemplo reemplaza un documento en la colección restaurants de la base de datos sample_restaurants. El método replace_one() reemplaza el primer documento en el que el valor del campo name es "Landmark Coffee Shop" por un nuevo documento.
Puede acceder a los documentos en la colección restaurants como instancias del tipo Document o de un tipo de dato personalizado. Para especificar qué tipo de dato representa los datos de la colección, realiza las siguientes acciones en las líneas resaltadas:
Para acceder a los documentos de la colección como documentos BSON, sustituye el parámetro
<T>tipo por<Document>y el marcador de posición<struct or doc>porreplace_doc.Para acceder a los documentos de la colección como instancias de la estructura
Restaurant, reemplaza el parámetro de tipo<T>por<Restaurant>y el marcador de posición<struct or doc>porreplace_struct. La estructuraRestaurantse define en la parte superior del archivo de código.
Selecciona el Asynchronous o la pestaña Synchronous para ver el código correspondiente para cada entorno de ejecución:
use std::env; use mongodb::{ bson::doc, Client, Collection }; use serde::{ Deserialize, Serialize }; struct Restaurant { borough: String, cuisine: String, name: String, } async fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri).await?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let filter = doc! { "name": "Landmark Coffee Shop" }; let replace_doc = doc! { "borough": "Brooklyn", "cuisine": "Café/Coffee/Tea", "name": "Harvest Moon Café", }; let replace_struct = Restaurant { borough: "Brooklyn".to_string(), cuisine: "Café/Coffee/Tea".to_string(), name: "Harvest Moon Café".to_string(), }; // Replace <struct or doc> with the replace_struct or replace_doc variable let res = my_coll.replace_one(filter, <struct or doc>).await?; println!("Replaced documents: {}", res.modified_count); Ok(()) }
Replaced documents: 1
use std::env; use mongodb::{ bson::doc, sync::{ Client, Collection } }; use serde::{ Deserialize, Serialize }; struct Restaurant { borough: String, cuisine: String, name: String, } fn main() -> mongodb::error::Result<()> { let uri = "<connection string>"; let client = Client::with_uri_str(uri)?; // Replace <T> with the <Document> or <Restaurant> type parameter let my_coll: Collection<T> = client .database("sample_restaurants") .collection("restaurants"); let filter = doc! { "name": "Landmark Coffee Shop" }; let replace_doc = doc! { "borough": "Brooklyn", "cuisine": "Café/Coffee/Tea", "name": "Harvest Moon Café", }; let replace_struct = Restaurant { borough: "Brooklyn".to_string(), cuisine: "Café/Coffee/Tea".to_string(), name: "Harvest Moon Café".to_string(), }; // Replace <struct or doc> with the replace_struct or replace_doc variable let res = my_coll.replace_one(filter, <struct or doc>).run()?; println!("Replaced documents: {}", res.modified_count); Ok(()) }
Replaced documents: 1
Modificar el comportamiento de reemplazo
Puedes modificar el comportamiento del método replace_one() llamando a métodos opcionales que establecen los campos de la estructura ReplaceOptions.
Nota
Opciones de configuración
Puedes configurar los campos de ReplaceOptions encadenando métodos del generador de opciones directamente a la llamada del método replace_one(). Si está utilizando una versión anterior del controlador, debe construir una instancia de ReplaceOptions encadenando métodos del generador de opciones al método builder(). Luego, pasa tu instancia de opciones como un parámetro a replace_one().
La siguiente tabla describe las opciones disponibles en ReplaceOptions:
Opción | Descripción |
|---|---|
| The set of filters specifying the array elements to which the
update applies. Type: Vec<Document> |
| If true, allows the driver to perform a write that violates
document-level validation. To learn more about validation, see
the guide on Schema Validation.Type: boolDefault: false |
| If true, the operation inserts a document if no documents match
the query filter.Type: bool |
| The collation to use when sorting results. To learn more about collations,
see the Collations guide. Type: CollationDefault: None |
| The index to use for the operation. Type: HintDefault: None |
| The write concern for the operation. If you don't set this
option, the operation inherits the write concern set for
the collection. To learn more about write concerns, see
Write Concern in the
MongoDB Server manual. Type: WriteConcern |
| A map of parameters and values. These parameters can be accessed
as variables in aggregation expressions. This option is available
only when connecting to MongoDB Server versions 5.0 and later. Type: Document |
| An arbitrary Bson value tied to the operation to trace
it through the database profiler, currentOp, and
logs. This option is available only when connecting to
MongoDB Server versions 4.4 and later.Type: BsonDefault: None |
El siguiente código muestra cómo establecer el campo upsert mediante el encadenamiento del método upsert() al método replace_one():
let res = my_coll .replace_one(filter_doc, replace_doc) .upsert(true) .await?;
Información Adicional
Para más información sobre los conceptos de esta guía, consulta la siguiente documentación:
Guía de operaciones compuestas
Guía de Actualización de documentos
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, vea la siguiente documentación de la API: