Docs Menu
Docs Home
/ /

Modificar documentos

En esta guía, puede aprender cómo modificar documentos en MongoDB mediante operaciones de actualización y reemplazo.

Las operaciones de actualización modifican los campos especificados, dejando los demás campos y valores sin modificar. Las operaciones de reemplazo eliminan todos los campos existentes de un documento, excepto el... _id campo y sustituir los campos eliminados por nuevos campos y valores.

Esta guía incluye las siguientes secciones:

  • Actualizardocumentos describe cómo utilizar el controlador para ejecutar operaciones de actualización

  • Reemplazar un documento describe cómo usar el controlador para ejecutar operaciones de reemplazo

  • Modificar el comportamiento deactualización y reemplazo describe cómo modificar el comportamiento predeterminado de los métodos descritos en esta guía

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

En MongoDB, todos los métodos para cambiar documentos siguen el mismo patrón:

firma del método changeX()

Nota

changeX() es un marcador de posición y no un método real.

Estos métodos toman los siguientes parámetros:

  • Un filtro de consulta para hacer coincidir uno o más documentos para cambiar

  • Un documento de actualización que especifica los cambios de campo y valor

El controlador Rust proporciona los siguientes métodos para cambiar documentos:

  • update_one()

  • update_many()

  • replace_one()

Puede recuperar y modificar datos en una sola acción mediante operaciones compuestas. Para obtener más información, consulte la guía sobre Operaciones compuestas.

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

Puede realizar operaciones de actualización con los siguientes métodos:

  • update_one(), que actualiza el primer documento que coincide con los criterios de búsqueda

  • update_many(), que actualiza todos los documentos que coinciden con los criterios de búsqueda

También puede encadenar métodos del generador de opciones a estos métodos de operación de actualización. Para obtener información sobre cómo modificar el comportamiento de los métodos de actualización, consulte la sección "Modificar el comportamiento de actualización y reemplazo" de esta guía.

Cada método utiliza un filtro de consulta y un documento de actualización que incluye al menos un operador de actualización. Este operador especifica el tipo de actualización que se realizará e incluye los campos y valores que describen el cambio. Los documentos de actualización utilizan el siguiente formato:

doc! { "<update operator>": doc! { "<field>": <value> } }

Para especificar varias actualizaciones en un documento de actualización, utilice el siguiente formato:

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

Consulte el manual del servidor MongoDB para obtener una lista completa de operadores de actualización y descripciones.

Nota

Pipelines de agregación en operaciones de actualización

Puede usar pipelines de agregación para realizar operaciones de actualización. Para obtener más información sobre las etapas de agregación que MongoDB admite en pipelines de agregación, consulte nuestro tutorial sobre cómo realizar actualizaciones con pipelines de agregación.

Los métodos update_one() y update_many() devuelven 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 se pasa a UpdateOne(), el método selecciona y actualiza el primer documento que coincida. Si ningún documento corresponde al filtro de query, la operación de actualización no realiza ningún cambio.

Los siguientes documentos describen a los empleados de una empresa:

{
"_id": ObjectId('4337'),
"name": "Shelley Olson",
"department": "Marketing",
"role": "Director",
"bonus": 3000
},
{
"_id": ObjectId('4902'),
"name": "Remi Ibrahim",
"department": "Marketing",
"role": "Consultant",
"bonus": 1800
}

Este ejemplo realiza una operación de actualización con el método update_many(). El método update_many() acepta los siguientes parámetros:

  • Un filtro de consulta para encontrar documentos donde el valor del campo department es "Marketing"

  • Un documento de actualización que contiene las siguientes actualizaciones:

    • Un operador $set para cambiar el valor de department a "Business Operations" y de role a "Analytics Specialist"

    • Un operador $inc para aumentar el valor de bonus en 500

let update_doc = doc! {
"$set": doc! { "department": "Business Operations",
"role": "Analytics Specialist" },
"$inc": doc! { "bonus": 500 }
};
let res = my_coll
.update_many(doc! { "department": "Marketing" }, update_doc)
.await?;
println!("Modified documents: {}", res.modified_count);
Modified documents: 2

Los siguientes documentos reflejan los cambios resultantes de la operación de actualización anterior:

{
"_id": ObjectId('4337'),
"name": "Shelley Olson",
"department": "Business Operations",
"role": "Analytics Specialist",
"bonus": 3500
},
{
"_id": ObjectId('4902'),
"name": "Remi Ibrahim",
"department": "Business Operations",
"role": "Analytics Specialist",
"bonus": 2300
}

El siguiente documento describe a un empleado de una empresa:

{
"_id": ObjectId('4274'),
"name": "Jill Millerton",
"department": "Marketing",
"role": "Consultant"
}

Este ejemplo consulta el documento anterior especificando un filtro de consulta que coincide con el valor único _id del documento. A continuación, el código realiza una operación de actualización con el método update_one(). El método update_one() acepta los siguientes parámetros:

  • Filtro de consulta que coincide con un documento en el que el valor del campo _id es ObjectId('4274')

  • Actualizar el documento que crea instrucciones para establecer el valor de name a "Jill Gillison"

let id = ObjectId::from_str("4274").expect("Could not convert to ObjectId");
let filter_doc = doc! { "_id": id };
let update_doc = doc! {
"$set": doc! { "name": "Jill Gillison" }
};
let res = my_coll
.update_one(filter_doc, update_doc)
.await?;
println!("Modified documents: {}", res.modified_count);
Modified documents: 1

El siguiente documento refleja los cambios resultantes de la operación de actualización anterior:

{
"_id": ObjectId('4274'),
"name": "Jill Gillison",
"department": "Marketing",
"role": "Consultant"
}

Tip

Para obtener más información sobre el _id campo, consulte la sección Campo _id de esta página o la documentación del método ObjectId() en el manual del servidor.

Puede realizar una operación de reemplazo con el método replace_one(). Este método reemplaza todos los campos existentes de un documento, excepto el campo _id, con los nuevos campos y valores que especifique.

También puede encadenar métodos del generador de opciones a un método de operación de reemplazo. Para obtener información sobre cómo modificar el comportamiento del replace_one() método, consulte la sección "Modificar el comportamiento de actualización y reemplazo" de esta guía.

El replace_one() método utiliza un filtro de consulta y un documento de reemplazo, que contiene 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 consulta que se pasa a replace_one(), el método selecciona y reemplaza el primer documento coincidente. Si ningún documento coincide con el filtro de consulta, la operación de reemplazo no realiza cambios.

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" ]
}

Puede modificar el comportamiento de los métodos update_one(), update_many y replace_one() llamando a los métodos de opciones que establecen los campos de la estructura UpdateOptions.

Nota

Opciones de configuración

Puede configurar los campos UpdateOptions encadenando los métodos del generador de opciones directamente a la llamada al método de actualización o reemplazo. Si utiliza una versión anterior del controlador, debe construir una instancia UpdateOptions encadenando los métodos del generador de opciones al método builder(). A continuación, pase la instancia de opciones como parámetro a update_one(), update_many o replace_one().

La siguiente tabla describe las opciones disponibles en UpdateOptions:

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 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 update_one():

let res = my_coll
.update_one(filter_doc, update_doc)
.upsert(true)
.await?;

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

Para obtener ejemplos ejecutables de las operaciones de actualización y reemplazo, consulte los siguientes ejemplos de uso:

Para obtener más información sobre los operadores de actualización, consulte Operadores de actualización en el manual del servidor.

Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API:

Volver

Insert

En esta página