Para agentes de IA: hay un índice de documentación disponible en https://www.mongodb.com/es/docs/llms.txt — versiones en markdown de todas las páginas están disponibles agregando .md a cualquier ruta URL.
Docs Menu

Reemplazar Documentos

En esta guía, aprenderás a utilizar el controlador de Rust para reemplazar documentos en una colección de MongoDB utilizando el método 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 los documentos, consulta la guía Actualizar documentos.

Esta guía incluye las siguientes secciones:

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.

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.

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>, ... }

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

matched_count

El número de documentos que coinciden con el filtro

modified_count

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

upserted_id

El _id del documento actualizado o vacío si no existe 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 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> 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 la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada runtime:

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

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

array_filters

Conjunto de filtros que especifican los elementos de la matriz a los que se aplica la actualización.

Tipo: Vec<Document>

bypass_document_validation

Si true es, permite que el controlador realice una escritura que infringe la validación a nivel de documento. Para obtener más información sobre la validación, consulte la guía sobre validación de esquemas.

Tipo: bool
Predeterminado: false

upsert

Si true es, la operación inserta un documento si ningún documento coincide con el filtro de consulta.

Tipo: bool

collation

La intercalación que se utilizará al ordenar los resultados. Para obtener más información sobre las intercalaciones, consulte la guía de intercalaciones.

Tipo: Collation
Predeterminado: None

hint

Índice a utilizar para la operación.

Tipo: Hint
Valor predeterminado: None

write_concern

La preocupación de escritura para la operación. Si no se configura esta opción, la operación hereda la preocupación de escritura establecida para la colección. Para obtener más información sobre las preocupaciones de escritura, consulte "Preocupación de escritura" en el manual del servidor MongoDB.

Tipo: WriteConcern

let_vars

Un mapa de parámetros y valores. Se puede acceder a estos parámetros como variables en las expresiones de agregación. Esta opción solo está disponible cuando se conecta a las versiones 5.0 y posteriores de MongoDB Server.

Tipo: Document

comment

Un Bson valor arbitrario vinculado a la operación para rastrearla a través del generador de perfiles de la base de datos, currentOp y los registros. Esta opción solo está disponible al conectarse a las versiones 4.4 y posteriores del servidor MongoDB.

Tipo: Bson
Predeterminado: 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?;

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: