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

Buscar documentos

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:

Varios de los ejemplos de esta guía utilizan los siguientes documentos de muestra. Cada documento representa un artículo en el 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 cómo insertar estos datos en una colección, consulta la guía Insertar documentos.

Utiliza operaciones de búsqueda para recuperar datos de MongoDB. Las operaciones de Find consisten en los métodos find() y find_one().

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 query, consulta la guía Especificar una query.

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, consulta el ejemplo de find_one().

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 de FindOptions y FindOneOptions de uso común que se pueden configurar llamando a sus métodos de construcción correspondientes:

Campo
Descripción

collation

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

Tipo: Collation
Por defecto: None

hint

El índice que se utilizará para la operación. Para obtener más información sobre los índices, consulte Índice en el manual del servidor.

Tipo: Hint
Por defecto: None

projection

La proyección que se utilizará al devolver los resultados. Para obtener más información sobre las proyecciones, consulte la guía Especificar campos para devolver.

Tipo: Document
Por defecto: None

read_concern

El nivel de consistencia de lectura que se utilizará para la operación de búsqueda. Si no establece esta opción, la operación hereda el nivel de consistencia de lectura establecido para la colección. Para obtener más información sobre el nivel de consistencia de lectura, consulte Nivel de consistencia de lectura en el manual del servidor.

Tipo: ReadConcern

skip

La cantidad de documentos que se deben omitir al devolver los resultados. Para aprender más sobre cómo usar el método de desarrolladores skip(), consulte Omitir.

Tipo: u64
Por defecto: None

sort

La clasificación que se utilizará al devolver los resultados. Por defecto, el driver devuelve los documentos en su orden natural, o tal como aparecen en la base de datos. Para aprender más, consulte orden natural en el glosario del manual del servidor. Para obtener más información sobre cómo usar el método de desarrolladores sort(), consulte Ordenar.

Tipo: Document
Por defecto: None

Nota

Opciones de configuración

Puedes configurar los campos FindOptions y FindOneOptions encadenando métodos generadores de opciones directamente al método de la operación de búsqueda. Si está utilizando una versión anterior del controlador, debe construir una instancia de FindOptions or FindOneOptions encadenando métodos del constructor de opciones al método builder(). Luego, pasa tu instancia de opciones como parámetro a find() o find_one().

Para una lista completa de ajustes que puede especificar para cada tipo, consulte la documentación de la API para FindOptions y FindOneOptions.

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.

Este ejemplo realiza las siguientes acciones:

  • Llama al método find()

  • Pasa un filtro de query a find() que coincide con documentos donde el valor de unit_price es menor que 12.00 y el valor de category no es "kitchen"

  • Encadena el método sort() a find() para clasificar los documentos coincidentes por unit_price en 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 }

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".

Puedes 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, sustituye el tipo de parámetro <T> en la línea resaltada por uno de los siguientes valores:

  • <Document>: Recupera e imprime los documentos de la colección como documentos BSON

  • <Restaurant>: Recupera e imprime documentos de la colección como instancias de la estructura Restaurant, definida al inicio del código

Selecciona la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada runtime:

use mongodb::{
bson::doc,
Client,
Collection
};
use futures::TryStreamExt;
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: 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 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 };
#[derive(Serialize, Deserialize, Debug)]
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(())
}

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

Puedes almacenar un filtro de query en un archivo JSON y cargarlo en tiempo de ejecución. Este enfoque te permite compartir definiciones de queries entre tu aplicación de Rust y herramientas externas, como el MongoDB Shell (mongosh).

Tip

Dependencia Serde JSON

Antes de cargar una query desde un archivo, añade la dependencia serde_json ejecutando el siguiente comando desde la raíz de tu Proyecto:

cargo add serde_json

Primero, crea un archivo JSON que contenga tu filtro de query. El siguiente archivo de muestra query.json contiene un filtro de query de comparación que coincide con los documentos en los que el valor del campo category es "kitchen":

query.json
{ "category": "kitchen" }

Para cargar este archivo en tu aplicación de Rust, lee el archivo utilizando el método std::fs::read_to_string(). Luego, llama a serde_json::from_str() para analizar el string JSON en una instancia de Document. Debido a que Document implementa el rasgo serde::Deserialize, puedes deserializarlo directamente desde una JSON string.

El siguiente ejemplo lee un filtro de query del archivo query.json y lo pasa al método find():

let json = std::fs::read_to_string("query.json")
.expect("failed to read query.json");
let filter: Document = serde_json::from_str(&json)
.expect("query.json contains invalid JSON");
let mut cursor = my_coll.find(filter).await?;
while let Some(doc) = cursor.try_next().await? {
println!("{:?}", doc);
}
Inventory { item: "blender", category: "kitchen", unit_price: 38.49 }
Inventory { item: "placemat", category: "kitchen", unit_price: 3.19 }

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 de unit_price es menor o igual a 20.00

  • Encadena el método skip() a find_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,
},
)

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".

Puedes 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, sustituye el tipo de parámetro <T> en la línea resaltada por uno de los siguientes valores:

  • <Document>: Recupera e imprime los documentos de la colección como documentos BSON

  • <Restaurant>: Recupera e imprime documentos de la colección como instancias de la estructura Restaurant, definida al inicio del código

Selecciona la pestaña Asynchronous o Synchronous para ver el código correspondiente para cada runtime:

use mongodb::{
bson::doc,
Client,
Collection
};
use serde::{ Deserialize, Serialize };
#[derive(Serialize, Deserialize, Debug)]
struct Restaurant {
name: String,
cuisine: 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 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 };
#[derive(Serialize, Deserialize, Debug)]
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(())
}

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",
},
)

Utiliza operaciones de agregación para recuperar y transformar datos de tus colecciones. Puede realizar operaciones de agregación utilizando el método aggregate().

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.

Puede modificar el comportamiento del método aggregate() encadenando los métodos del generador de opciones AggregateOptions a aggregate().

La siguiente tabla describe los campos de AggregateOptions de uso común que se pueden configurar llamando a los métodos desarrolladores correspondientes:

Campo
Descripción

allow_disk_use

Permite guardar en archivos temporales. Si true, las etapas de agregación pueden guardar datos en el subdirectorio _tmp en el directorio dbPath.

Tipo: bool
Por defecto: false

batch_size

Especifica el número máximo de documentos que el servidor devuelve por agrupar de cursor. Esta opción establece el número de documentos que el cursor mantiene en la memoria en lugar del número de documentos que el cursor devuelve.

Tipo: u32
Por defecto: 101 documentos inicialmente, 16 MB máximo para agrupar posteriores

collation

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

Tipo: Collation
Por defecto: None

hint

El índice que se utilizará para la operación. Para obtener más información sobre los índices, consulte Índice en el manual del servidor.

Tipo: Hint
Por defecto: None

read_concern

El nivel de consistencia de lectura que se utilizará para la operación de búsqueda. Si no establece esta opción, la operación hereda el nivel de consistencia de lectura establecido para la colección. Para obtener más información sobre el nivel de consistencia de lectura, consulte Nivel de consistencia de lectura en el manual del servidor.

Tipo: ReadConcern

write_concern

El nivel de confirmación de escritura (write concern) para la operación. Si no establece esta opción, la operación hereda el nivel de confirmación de escritura (write concern) establecido para la colección. Para obtener más información sobre el nivel de confirmación de escritura (write concern), consulta Nivel de confirmación de escritura (write concern) en el manual del servidor.

Tipo: WriteConcern

Para obtener una lista completa de configuraciones, consulta la documentación de la API para AggregateOptions.

Este ejemplo muestra cómo llamar al método aggregate() con un pipeline que contiene las siguientes etapas:

  • $group etapa para calcular el promedio del campo unit_price para cada valor del campo category

  • $sort escenario para ordenar los resultados por avg_price en 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)})

Para ejemplos ejecutables de las operaciones de búsqueda, consulta los siguientes ejemplos de uso:

Para obtener más información sobre las operaciones en esta guía, consulte 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: