Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Reemplazar Documentos

En esta guía, puede aprender cómo usar el controlador de Rust para reemplazar documentos en una colección de MongoDB mediante el uso del 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 cómo actualizar campos específicos en los documentos, consulte la 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 comportamiento de replace_one() reemplazo describe cómo modificar el comportamiento predeterminado del método.

  • Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía

Cada documento en una colección de MongoDB tiene un campo _id único e inmutable. Si intenta cambiar el campo _id mediante una operación de reemplazo, el controlador genera una excepción WriteError y no realiza ninguna actualización.

Puedes realizar una operación de reemplazo con el método replace_one(). Este método elimina todos los campos existentes de un documento, excepto el campo _id, y los sustituye por nuevos campos y valores que tú especifiques.

También puede encadenar métodos del constructor de opciones al replace_one() método. Para obtener información sobre cómo modificar el comportamiento de este método, consulte la sección Modificar 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.

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

  • Filtro de consulta para que coincida con el documento que se va a reemplazar

  • Documentos de reemplazo que contienen los campos y valores que reemplazarán a un documento existente.

Los documentos de reemplazo utilizan el siguiente formato:

doc! { "<field>": <value>, "<field>": <value>, ... }

El método replace_one() devuelve un tipo UpdateResult si la operación se realiza correctamente. El tipo UpdateResult contiene las siguientes propiedades que describen la operación:

Propiedad
Descripción

matched_count

El número de documentos coincidentes con el filtro

modified_count

El número de documentos modificados por la operación

upserted_id

El _id del documento insertado, o vacío si no hay ninguno

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.

Esta sección proporciona ejemplos que demuestran cómo utilizar el método replace_one() para reemplazar documentos en una colección.

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 name de "Susan Lee"

  • Un valor role de "Lead Consultant"

  • Un valor team_members de [ "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" ]
}

Este ejemplo reemplaza un documento de la colección restaurants de la base de datos sample_restaurants. El método replace_one() reemplaza el primer documento cuyo valor del campo name sea "Landmark Coffee Shop" por un nuevo documento.

Puede acceder a los documentos de la colección restaurants como instancias del tipo Document o como un tipo de dato personalizado. Para especificar qué tipo de dato representa los datos de la colección, realice 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> por replace_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> por replace_struct. La estructura Restaurant se 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 };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
borough: String,
cuisine: String,
name: String,
}
#[tokio::main]
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 };
#[derive(Serialize, Deserialize, Debug)]
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

Puede modificar el comportamiento del método replace_one() llamando a métodos de opciones que establecen 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

array_filters

The set of filters specifying the array elements to which the update applies.

Type: Vec<Document>

bypass_document_validation

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: bool
Default: false

upsert

If true, the operation inserts a document if no documents match the query filter.

Type: bool

collation

The collation to use when sorting results. To learn more about collations, see the Collations guide.

Type: Collation
Default: None

hint

The index to use for the operation.

Type: Hint
Default: None

write_concern

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

let_vars

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

comment

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: Bson
Default: None

El siguiente código muestra cómo establecer el campo upsert encadenando el método upsert() al método replace_one():

let res = my_coll
.replace_one(filter_doc, replace_doc)
.upsert(true)
.await?;

Para más información sobre los conceptos de esta guía, consulta la siguiente documentación:

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:

Volver

Update Documents

En esta página