Overview
En esta guía, puedes aprender cómo recuperar datos de tus colecciones MongoDB usando operaciones de lectura. Las operaciones de lectura son comandos que recuperan documentos del servidor.
Hay dos tipos de operaciones de lectura:
Operaciones de búsqueda, que permiten recuperar documentos de tus colecciones.
Operaciones de agregación, que te permiten transformar los datos en tus colecciones
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 de lectura
Operaciones de búsqueda describe cómo utilizar el controlador para ejecutar operaciones de búsqueda
Operaciones de agregación describe cómo utilizar el controlador para ejecutar operaciones de agregación
Información adicional proporciona enlaces a recursos y documentación de la API para los tipos y métodos mencionados en esta guía
Datos de muestra para ejemplos
Varios de los ejemplos de esta guía utilizan los siguientes documentos de muestra. Cada documento representa un artículo del inventario de una tienda y contiene información sobre su categorización y precio unitario:
let docs = vec![ Inventory { item: "candle".to_string(), category: "decor".to_string(), unit_price: 2.89, }, Inventory { item: "blender".to_string(), category: "kitchen".to_string(), unit_price: 38.49, }, Inventory { item: "placemat".to_string(), category: "kitchen".to_string(), unit_price: 3.19, }, Inventory { item: "watering can".to_string(), category: "garden".to_string(), unit_price: 11.99, }, ];
Para aprender a insertar estos datos en una colección, consulte la Guía deinserción de documentos.
Operaciones de búsqueda
Utilice operaciones de búsqueda para recuperar datos de MongoDB. Las operaciones de búsqueda consisten en: find() y find_one() métodos.
Encontrar todos los documentos coincidentes
Para encontrar todos los documentos que coincidan con tus criterios, utiliza el método find(). Este método toma un filtro de query como parámetro. Un filtro de query consta de los campos y valores que forman los criterios para que los documentos coincidan.
El método retorna un tipo Cursor a través del cual puedes iterar para recuperar cualquier documento que coincida con los criterios de filtro.
Para ver un ejemplo que utiliza este método para recuperar datos, consulta el ejemplo de find().
Para obtener más información sobre cómo especificar una consulta, consulte la guía Especificar una consulta.
Encuentre un documento
Para encontrar el primer documento que cumpla con tus criterios, usa el método find_one(). Este método toma un filtro de query como parámetro. Un filtro de query consta de los campos y valores que forman los criterios para que los documentos coincidan.
Si un documento coincide con los criterios del filtro, el método devuelve un tipo Result<Option<T>> con un valor de Some. Si ningún documento cumple con los criterios del filtro, find_one() devuelve un tipo Result<Option<T>> con un valor de None.
Para ver un ejemplo que utiliza este método para recuperar datos, consulte el ejemplo find_one().
Modificar el comportamiento de búsqueda
Puede modificar el comportamiento del método find() encadenando métodos del generador de opciones FindOptions a find(), y puede modificar el comportamiento del método find_one() encadenando métodos del generador de opciones FindOneOptions a find_one().
La siguiente tabla describe los campos FindOptions y FindOneOptions comúnmente utilizados que puede configurar llamando a sus métodos de generación correspondientes:
Campo | Descripción |
|---|---|
| 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. Type: HintDefault: None |
| The projection to use when returning results. To learn more about projections, see the Specify Fields to Return guide. Type: DocumentDefault: None |
| The read concern to use for the find operation. If you don't
set this option, the operation inherits the read concern set for the
collection. To learn more about read concerns, see
Read Concern
in the Server manual. Type: ReadConcern |
| The number of documents to skip when returning results. To learn more
about how to use the skip() builder method, see Skip.Type: u64Default: None |
| The sort 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. To learn more about how to use the
sort() builder method, see Sort.Type: DocumentDefault: None |
Nota
Opciones de configuración
Puede configurar los campos FindOptions y FindOneOptions encadenando los métodos del generador de opciones directamente a la llamada al método de la operación de búsqueda. Si utiliza una versión anterior del controlador, debe construir una instancia FindOptions o FindOneOptions encadenando los métodos del generador de opciones al método builder(). A continuación, pase la instancia de opciones como parámetro a find() o find_one().
Para obtener una lista completa de configuraciones que puede especificar para cada tipo, consulte la documentación de la API para FindOptionsy FindOneOptions.
Encuentra ejemplos
Las siguientes secciones contienen ejemplos que utilizan los métodos find() y find_one() para recuperar documentos de muestra que coinciden con los criterios de filtro.
Ejemplo de find()
Este ejemplo realiza las siguientes acciones:
Llama al método
find()Pasa un filtro de consulta a
find()que coincide con los documentos donde el valor deunit_pricees menor que12.00y el valor decategoryno es"kitchen"Encadena el método
sort()afind()para clasificar los documentos coincidentes porunit_priceen orden descendente
let mut cursor = my_coll .find(doc! { "$and": vec! [ doc! { "unit_price": doc! { "$lt": 12.00 } }, doc! { "category": doc! { "$ne": "kitchen" } } ] }) .sort(doc! { "unit_price": -1 }) .await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); }
Inventory { item: "watering can", category: "garden", unit_price: 11.99 } Inventory { item: "candle", category: "decor", unit_price: 2.89 }
Ejemplo de archivo completo: Buscar documentos
Este ejemplo recupera los documentos que coinciden con un filtro de query de la colección restaurants en la base de datos sample_restaurants. El método find() devuelve todos los documentos en los que el valor del campo cuisine es "French".
Puede modelar cada documento recuperado como un tipo Document o un tipo de datos personalizado. Para especificar qué tipo de datos representa los datos de la colección, reemplace el parámetro de tipo <T> en la línea resaltada por uno de los siguientes valores:
<Document>:Recupera e imprime documentos de colección como documentos BSON<Restaurant>: Recupera e imprime documentos de la colección como instancias de la estructuraRestaurant, definida al inicio del código
Selecciona el Asynchronous o la pestaña Synchronous para ver el código correspondiente para cada entorno de ejecución:
use mongodb::{ bson::doc, Client, Collection }; use futures::TryStreamExt; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: 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 mut cursor = my_coll.find( doc! { "cuisine": "French" } ).await?; while let Some(doc) = cursor.try_next().await? { println!("{:#?}", doc); } Ok(()) }
use mongodb::{ bson::doc, sync::{Client, Collection} }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: 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 mut cursor = my_coll.find( doc! { "cuisine": "French" } ).run()?; for result in cursor { println!("{:#?}", result?); } Ok(()) }
Salida
Selecciona la pestaña BSON Document Results o Restaurant Struct Results para ver la salida de código correspondiente según el parámetro de tipo de tu colección:
... Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Cafe Un Deux Trois", ), ... }), ), Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Calliope", ), ... }), ) ...
... Restaurant { name: "Cafe Un Deux Trois", cuisine: "French", } Restaurant { name: "Calliope", cuisine: "French", } ...
Ejemplo find_one()
Este ejemplo realiza las siguientes acciones:
Llama al método
find_one()Pasa un filtro de query a
find_one()que coincide con los documentos en los que el valor deunit_pricees menor o igual a20.00Encadena el método
skip()afind_one()para omitir los primeros dos documentos coincidentes
let result = my_coll .find_one(doc! { "unit_price": doc! { "$lte": 20.00 } }) .skip(2) .await?; println!("{:#?}", result);
Some( Inventory { item: "watering can", category: "garden", unit_price: 11.99, }, )
Ejemplo de archivo completo: Buscar un documento
Este ejemplo recupera un documento que coincide con un filtro de query de la colección restaurants en la base de datos sample_restaurants. El método find_one() devuelve el primer documento en el que el valor del campo name es "Tompkins Square Bagels".
Puede modelar el documento recuperado como un tipo Document o un tipo de datos personalizado. Para especificar qué tipo de datos representa los datos de la colección, reemplace el parámetro de tipo <T> en la línea resaltada por uno de los siguientes valores:
<Document>:Recupera e imprime documentos de colección como documentos BSON<Restaurant>: Recupera e imprime documentos de la colección como instancias de la estructuraRestaurant, definida al inicio del código
Seleccione la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada tiempo de ejecución:
use mongodb::{ bson::doc, Client, Collection }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: 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 result = my_coll.find_one( doc! { "name": "Tompkins Square Bagels" } ).await?; println!("{:#?}", result); Ok(()) }
use mongodb::{ bson::doc, sync::{Client, Collection} }; use serde::{ Deserialize, Serialize }; struct Restaurant { name: String, cuisine: 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 result = my_coll.find_one( doc! { "name": "Tompkins Square Bagels" } ).run()?; println!("{:#?}", result); Ok(()) }
Salida
Selecciona la pestaña BSON Document Result o Restaurant Struct Result para ver la salida de código correspondiente según el parámetro de tipo de tu colección:
Some( Document({ "_id": ObjectId( "...", ), ... "name": String( "Tompkins Square Bagels", ), ... }), )
Some( Restaurant { name: "Tompkins Square Bagels", cuisine: "American", }, )
Operaciones de agregación
Utiliza operaciones de agregación para recuperar y transformar datos de tus colecciones. Puede realizar operaciones de agregación utilizando el método aggregate().
Agrupar datos de documentos
El método aggregate() toma una pipeline de agregación como parámetro. Una pipeline de agregación incluye una o más etapas que especifican cómo transformar los datos. Una etapa incluye un operador de agregación (precedido por un $) y cualquier parámetro requerido para ese operador.
Para obtener más información sobre las agregaciones y ver ejemplos de agregación, consulte la guía de Agregación.
El método devuelve los documentos resultantes en un tipo Cursor. Si tu pipeline de agregación no contiene una etapa $match, el pipeline procesa todos los documentos de la colección.
Modificar el comportamiento de agregación
Puede modificar el comportamiento del método aggregate() encadenando los métodos de generación de opciones AggregateOptions a aggregate().
La siguiente tabla describe los campos AggregateOptions de uso común que puede configurar llamando a sus métodos de generación correspondientes:
Campo | Descripción |
|---|---|
| Enables writing to temporary files. If true,
aggregation stages can write data to the _tmp subdirectory in the
dbPath directory.Type: boolDefault: false |
| Specifies the maximum number of documents the server returns per
cursor batch. This option sets the number of documents the cursor
keeps in memory rather than the number of documents the cursor
returns. Type: u32Default: 101 documents initially, 16 MB maximum for
subsequent batches |
| 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. Type: HintDefault: None |
| The read concern to use for the find operation. If you don't
set this option, the operation inherits the read concern set for the
collection. To learn more about read concerns, see
Read Concern
in the Server manual. Type: ReadConcern |
| 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 |
Para obtener una lista completa de configuraciones, consulta la documentación de la API para AggregateOptions.
Ejemplo
Este ejemplo muestra cómo llamar al método aggregate() con un pipeline que contiene las siguientes etapas:
$groupetapa para calcular el promedio del campounit_pricepara cada valor del campocategory$sortescenario para ordenar los resultados poravg_priceen orden ascendente
let pipeline = vec![ doc! { "$group": doc! { "_id" : doc! {"category": "$category"} , "avg_price" : doc! { "$avg" : "$unit_price" } } }, doc! { "$sort": { "_id.avg_price" : 1 } }, ]; let mut cursor = my_coll.aggregate(pipeline).await?; while let Some(result) = cursor.try_next().await? { println!("{:?}", result); }
Document({"_id": Document({"category": String("decor")}), "avg_price": Double(2.890000104904175)}) Document({"_id": Document({"category": String("kitchen")}), "avg_price": Double(20.840000867843628)}) Document({"_id": Document({"category": String("garden")}), "avg_price": Double(11.989999771118164)})
Información Adicional
Para ejemplos ejecutables de las operaciones de búsqueda, consulta los siguientes ejemplos de uso:
Para obtener más información sobre las operaciones de esta guía, consulte la siguiente documentación:
agregación guide
Sort guide
Skip guide
Limit guide
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: