Overview
En esta guía, puedes aprender a usar el controlador de Rust para realizar operaciones compuestas.
Las operaciones compuestas combinan la funcionalidad de las operaciones de lectura y escritura en una sola. Acción atómica. Si realiza una operación de lectura y una de escritura consecutivamente, alguien podría modificar el documento de destino entre ambas, lo que generaría resultados inesperados. Al realizar una operación compuesta, MongoDB impide cambios intermedios en los datos mediante un bloqueo de escritura en el documento que está modificando hasta que se complete la operación.
Puede realizar las siguientes operaciones compuestas con el controlador:
Buscar y eliminar un documento
Buscar y actualizar un documento
Buscar y reemplazar un documento
Esta guía incluye las siguientes secciones:
Datos de muestra para ejemplos presenta los datos de muestra que se utilizan en los ejemplos de operaciones compuestas
Buscar y eliminar un documento describe cómo buscar y eliminar un documento en una sola operación
Buscar y actualizar un documento describe cómo buscar y actualizar un documento en una sola operación
Buscar y reemplazar un documento describe cómo buscar y reemplazar un documento en una sola operación
Información adicional proporciona enlaces a recursos y documentación de API para los tipos y métodos mencionados en esta guía.
Datos de muestra para ejemplos
Los ejemplos de esta guía utilizan los siguientes documentos de muestra. Cada documento representa a un estudiante y contiene información sobre su edad y la escuela a la que asiste:
{ "name": "Alex Johnson", "age": 8, "school": "Lakeside Elementary" }, { "name": "Samara Khan", "age": 11, "school": "Rolling Hills Middle School" }, { "name": "Ben Joseph", "age": 16, "school": "Aurora High School" }, { "name": "Deanna Porowski", "age": 10, "school": "Lakeside Elementary" }
Buscar y eliminar un documento
El find_one_and_delete() El método busca y elimina el primer documento que coincide con el filtro de consulta especificado. Si un documento cumple los criterios de filtro, el método devuelve un tipo Some. Si ningún documento coincide, devuelve un tipo None.
Nota
Si desea realizar otras operaciones entre buscar y eliminar un documento, puede llamar al método find_one() seguido del método delete_one().
Modificar el comportamiento de búsqueda y eliminación
Opcionalmente, puede modificar el comportamiento del método find_one_and_delete() pasando una instancia FineOneAndDeleteOptions como parámetro. Para usar los valores predeterminados para cada configuración, especifique el valor None en el parámetro de opciones.
La siguiente tabla describe las opciones disponibles en FineOneAndDeleteOptions:
Opción | Descripción |
|---|---|
| The maximum amount of time in milliseconds that the query can
run. Type: Duration |
| The projection to use when returning results. Type: DocumentDefault: None |
| The sorting order to use when returning results. By default, the driver
returns documents in their natural order, or as they appear in
the database. To learn more, see natural order
in the Server manual glossary. Type: DocumentDefault: 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
Server manual. Type: WriteConcern |
| 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. To learn more about
indexes, see Indexes in the Server
manual. This option is available only when connecting to
MongoDB Server versions 4.4 and later. Type: HintDefault: None |
| A map of parameters and values. You can access these parameters
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 controlador de Rust implementa el patrón de diseño Builder para la creación de una instancia FindOneAndDeleteOptions. Puedes usar el método builder() del tipo para construir una instancia de opciones encadenando las funciones del constructor de opciones una a una.
El siguiente código muestra cómo construir una instancia FindOneAndDeleteOptions y pasarla al método find_one_and_delete():
let opts = FindOneAndDeleteOptions::builder().comment(bson!("hello")).build(); let res = my_coll.find_one_and_delete(filter, opts).await?;
Ejemplo de búsqueda y eliminación
El siguiente ejemplo utiliza el método find_one_and_delete() para hacer coincidir y eliminar el primer documento donde el valor del campo age sea menor o igual a 10:
let filter = doc! { "age": doc! { "$lte": 10 } }; let res = my_coll.find_one_and_delete(filter, None).await?; println!("Deleted document:\n{:?}", res);
Deleted document: Some(Document({"_id": ObjectId("..."), "name": String("Deanna Porowski"), "age": Int32(10), "school": String("Lakeside Elementary")}))
Buscar y actualizar un documento
El método find_one_and_update() busca y actualiza el primer documento que coincide con el filtro de consulta especificado. La operación actualiza el documento según las especificaciones proporcionadas en un documento de actualización. Si un documento cumple con los criterios del filtro, el método devuelve un tipo Some. Si ningún documento coincide, devuelve un tipo None.
Nota
Si desea realizar otras operaciones entre buscar y actualizar un documento, puede llamar al método find_one() seguido del método update_one().
Modificar el comportamiento de búsqueda y actualización
Opcionalmente, puede modificar el comportamiento del método find_one_and_update() pasando una instancia FindOneAndUpdateOptions como parámetro. Para usar los valores predeterminados para cada configuración, especifique el valor None en el parámetro de opciones.
La siguiente tabla describe las opciones disponibles en FineOneAndDeleteOptions:
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
Schema Validation in the Server manual.Type: boolDefault: false |
| The maximum amount of time in milliseconds that the query can
run. Type: Duration |
| The projection to use when returning results. Type: DocumentDefault: None |
| If Before, the operation returns the document before the
update. If After, the operation returns the updated document.Type: ReturnDocumentDefault: ReturnDocument::Before |
| The sorting order to use when returning results. By default, the driver
returns documents in their natural order, or as they appear in
the database. To learn more, see natural order
in the Server manual glossary. Type: DocumentDefault: None |
| If true, the operation inserts a document if no documents match
the query filter. Type: boolDefault: false |
| 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 |
| 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. To learn more about
indexes, see Indexes in the Server
manual. This option is available only when connecting to
MongoDB Server versions 4.4 and later. Type: HintDefault: None |
| A map of parameters and values. You can access these parameters
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 controlador de Rust implementa el patrón de diseño Builder para la creación de una instancia FindOneAndUpdateOptions. Puedes usar el método builder() del tipo para construir una instancia de opciones encadenando los métodos del constructor de opciones uno a uno.
El siguiente código muestra cómo construir una instancia FindOneAndUpdateOptions y pasarla al método find_one_and_update():
let opts = FindOneAndUpdateOptions::builder().comment(bson!("hello")).build(); let res = my_coll.find_one_and_update(filter, update, opts).await?;
Ejemplo de búsqueda y actualización
Este ejemplo muestra cómo llamar al método find_one_and_update() con los siguientes parámetros:
Un filtro de consulta que coincide con un documento donde el valor de
schooles"Aurora High School"Un documento de actualización que establece el campo
schoolen"Durango High School"e incrementa el campoageen1Una
FindOneAndUpdateOptionsinstancia que devuelve el documento después de la actualización
let filter = doc! { "school": "Aurora High School" }; let update = doc! { "$set": doc! { "school": "Durango High School" }, "$inc": doc! { "age": 1 } }; let opts = FindOneAndUpdateOptions::builder() .return_document(Some(ReturnDocument::After)) .build(); let res = my_coll.find_one_and_update(filter, update, opts).await?; println!("Updated document:\n{:?}", res);
Updated document: Some(Document({"_id": ObjectId("..."), "name": String("Ben Joseph"), "age": Int32(17), "school": String("Durango High School")}))
Buscar y reemplazar un documento
El método find_one_and_replace() busca y reemplaza el primer documento que coincida con el filtro de consulta especificado. La operación reemplaza todos los campos del documento, excepto el campo _id, con los campos y valores que proporcione. Si un documento cumple los criterios del filtro, el método devuelve un tipo Some. Si ningún documento coincide, devuelve un tipo None.
Nota
Si desea realizar otras operaciones entre buscar y reemplazar un documento, puede llamar al método find_one() seguido del método replace_one().
Modificar el comportamiento de buscar y reemplazar
Opcionalmente, puede modificar el comportamiento del método find_one_and_replace() pasando una instancia FindOneAndReplaceOptions como parámetro. Para usar los valores predeterminados para cada configuración, especifique el valor None en el parámetro de opciones.
La siguiente tabla describe las opciones disponibles en FindOneAndReplaceOptions:
Opción | Descripción |
|---|---|
| If true, allows the driver to perform a write that violates
document-level validation. To learn more about validation, see
Schema Validation in the Server manual.Type: boolDefault: false |
| The maximum amount of time in milliseconds that the query can
run. Type: Duration |
| The projection to use when returning results. Type: DocumentDefault: None |
| If Before, the operation returns the document before the
update. If After, the operation returns the updated document.Type: ReturnDocumentDefault: ReturnDocument::Before |
| The sorting order to use when returning results. By default, the driver
returns documents in their natural order, or as they appear in
the database. To learn more, see natural order
in the Server manual glossary. Type: DocumentDefault: None |
| If true, the operation inserts a document if no documents match
the query filter. Type: boolDefault: false |
| 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 |
| 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. To learn more about
indexes, see Indexes in the Server
manual. This option is available only when connecting to
MongoDB Server versions 4.4 and later. Type: HintDefault: None |
| A map of parameters and values. You can access these parameters
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 controlador de Rust implementa el patrón de diseño Builder para la creación de una instancia FindOneAndReplaceOptions. Puedes usar el método builder() del tipo para construir una instancia de opciones encadenando las funciones del constructor de opciones una a una.
El siguiente código muestra cómo construir una instancia FindOneAndReplaceOptions y pasarla al método find_one_and_replace():
let opts = FindOneAndReplaceOptions::builder().comment(bson!("hello")).build(); let res = my_coll.find_one_and_replace(filter, replacement, opts).await?;
Ejemplo de buscar y reemplazar
Este ejemplo muestra cómo llamar al método find_one_and_replace() con los siguientes parámetros:
Un filtro de consulta que coincide con un documento donde el valor de
nameincluye la cadena"Johnson"Un documento de reemplazo que describe a un nuevo estudiante
Una instancia
FindOneAndReplaceOptionsque devuelve el documento después del reemplazo y proyecta solo los camposnameyschoolen la salida
let filter = doc! { "name": doc! { "$regex": "Johnson" } }; let replacement = doc! { "name": "Toby Fletcher", "age": 14, "school": "Durango High School" }; let opts = FindOneAndReplaceOptions::builder() .return_document(Some(ReturnDocument::After)) .projection(doc! { "name": 1, "school": 1, "_id": 0 }) .build(); let res = my_coll.find_one_and_replace(filter, replacement, opts).await?; println!("Document after replacement:\n{:?}", res);
Document after replacement: Some(Document({"name": String("Toby Fletcher"), "school": String("Durango High School")}))
Información Adicional
Para obtener más información sobre las operaciones de esta guía, consulte la siguiente documentación:
Documentación de la API
Para obtener más información sobre los métodos y tipos mencionados en esta guía, consulte la siguiente documentación de API: