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

Agregación

En esta guía, puedes aprender cómo realizar operaciones de agregación en el controlador de Rust.

Las operaciones de agregación procesan datos en tus colecciones de MongoDB según las especificaciones que puedes establecer en un pipeline de agregación. Un pipeline de agregación consta de una o más etapas. Cada etapa realiza una operación basada en sus operadores de expresión. Después de que el driver ejecute la pipeline de agregación, devuelve un resultado agregado.

Esta guía incluye las siguientes secciones:

Tip

Tutoriales completos sobre agregación

Puedes encontrar tutoriales que proporcionan explicaciones detalladas de tareas comunes de agregación en la sección Tutoriales completos de canalización de agregación del manual del servidor. Selecciona un tutorial y luego elige Rust en el menú desplegable Select your language en la esquina superior derecha de la página.

Las operaciones de agregación funcionan de manera similar a las fábricas de automóviles con líneas de ensamblaje. Las líneas de ensamblaje cuentan con estaciones dotadas de herramientas especializadas para llevar a cabo tareas específicas. Por ejemplo, al fabricar un automóvil, la línea de ensamblaje comienza con el chasis. Luego, a medida que el bastidor del auto avanza por la línea de montaje, cada estación ensambla una pieza diferente. El resultado es un producto final transformado, el auto terminado.

La línea de montaje representa el pipeline de agregación, las estaciones individuales representan las etapas de agregación, las herramientas especializadas representan los operadores de expresión y el producto final representa el resultado agregado.

La siguiente tabla enumerade las diferentes tareas que puede realizar con las operaciones de búsqueda, en comparación con lo que puede lograr con las operaciones de agregación. El marco de agregación proporciona una funcionalidad ampliada que permite transformar y manipular los datos.

Operaciones de búsqueda
Operaciones de agregación

Selecciona ciertos documentos para devolver
Selecciona qué campos devolver
Ordena los resultados
Limita los resultados
Cuenta los resultados

Seleccione ciertos documentos para devolver
Seleccione qué campos devolver
Ordene los resultados
Limite los resultados
Cuente los resultados
Cambie el nombre de los campos
Calcule nuevos campos
Resuma los datos
Conecte y combine conjuntos de datos

Al llevar a cabo operaciones de agregación, considerar las siguientes limitaciones:

  • Los documentos devueltos no deben violar el límite de tamaño de documento BSON de 16 megabytes.

  • Las etapas del pipeline tienen un límite de memoria de 100 megabytes por defecto. Si es necesario, puede superar este límite configurando el campo allow_disk_use en su AggregateOptions.

  • El operador $graphLookup tiene un límite estricto de memoria de 100 megabytes e ignora la configuración de allow_disk_use.

Los ejemplos de esta sección utilizan los siguientes documentos de muestras. Cada documento representa un perfil de usuario en un sitio web de revisiones de libros y contiene información sobre su nombre, edad, intereses de género y la fecha en que la persona estuvo activa por última vez en el sitio web:

{ "name": "Sonya Mehta", "age": 23, "genre_interests": ["fiction", "mystery", "memoir"], "last_active": { "$date": "2023-05-13T00:00:00.000Z" } },
{ "name": "Selena Sun", "age": 45, "genre_interests": ["fiction", "literary", "theory"], "last_active": { "$date": "2023-05-25T00:00:00.000Z" } },
{ "name": "Carter Johnson", "age": 56, "genre_interests": ["literary", "self help"], "last_active": { "$date": "2023-05-31T00:00:00.000Z" } },
{ "name": "Rick Cortes", "age": 18, "genre_interests": ["sci-fi", "fantasy", "memoir"], "last_active": { "$date": "2023-07-01T00:00:00.000Z" } },
{ "name": "Belinda James", "age": 76, "genre_interests": ["literary", "nonfiction"], "last_active": { "$date": "2023-06-11T00:00:00.000Z" } },
{ "name": "Corey Saltz", "age": 29, "genre_interests": ["fiction", "sports", "memoir"], "last_active": { "$date": "2023-01-23T00:00:00.000Z" } },
{ "name": "John Soo", "age": 16, "genre_interests": ["fiction", "sports"], "last_active": { "$date": "2023-01-03T00:00:00.000Z" } },
{ "name": "Lisa Ray", "age": 39, "genre_interests": ["poetry", "art", "memoir"], "last_active": { "$date": "2023-05-30T00:00:00.000Z" } },
{ "name": "Kiran Murray", "age": 20, "genre_interests": ["mystery", "fantasy", "memoir"], "last_active": { "$date": "2023-01-30T00:00:00.000Z" } },
{ "name": "Beth Carson", "age": 31, "genre_interests": ["mystery", "nonfiction"], "last_active": { "$date": "2023-08-04T00:00:00.000Z" } },
{ "name": "Thalia Dorn", "age": 21, "genre_interests": ["theory", "literary", "fiction"], "last_active": { "$date": "2023-08-19T00:00:00.000Z" } },
{ "name": "Arthur Ray", "age": 66, "genre_interests": ["sci-fi", "fantasy", "fiction"], "last_active": { "$date": "2023-11-27T00:00:00.000Z" } }

El siguiente ejemplo calcula la edad promedio, mínima y máxima de los usuarios interesados en cada género.

El pipeline de agregación contiene las siguientes etapas:

  • Una etapa de $unwind para separar cada entrada de arreglo en el campo genre_interests en un nuevo documento.

  • Una etapa $group para agrupar documentos por valor del campo genre_interests. Esta etapa encuentra la edad promedio, mínima y máxima de los usuarios utilizando los operadores $avg, $min y $max.

let age_pipeline = vec![
doc! { "$unwind": doc! { "path": "$genre_interests" } },
doc! { "$group": doc! {
"_id": "$genre_interests",
"avg_age": doc! { "$avg": "$age" },
"min_age": doc! { "$min": "$age" },
"max_age": doc! { "$max": "$age" }
} }
];
let mut results = my_coll.aggregate(age_pipeline).await?;
while let Some(result) = results.try_next().await? {
println!("* {:?}", result);
}
* { "_id": "memoir", "avg_age": 25.8, "min_age": 18, "max_age": 39 }
* { "_id": "sci-fi", "avg_age": 42, "min_age": 18, "max_age": 66 }
* { "_id": "fiction", "avg_age": 33.333333333333336, "min_age": 16, "max_age": 66 }
* { "_id": "nonfiction", "avg_age": 53.5, "min_age": 31, "max_age": 76 }
* { "_id": "self help", "avg_age": 56, "min_age": 56, "max_age": 56 }
* { "_id": "poetry", "avg_age": 39, "min_age": 39, "max_age": 39 }
* { "_id": "literary", "avg_age": 49.5, "min_age": 21, "max_age": 76 }
* { "_id": "fantasy", "avg_age": 34.666666666666664, "min_age": 18, "max_age": 66 }
* { "_id": "mystery", "avg_age": 24.666666666666668, "min_age": 20, "max_age": 31 }
* { "_id": "theory", "avg_age": 33, "min_age": 21, "max_age": 45 }
* { "_id": "art", "avg_age": 39, "min_age": 39, "max_age": 39 }
* { "_id": "sports", "avg_age": 22.5, "min_age": 16, "max_age": 29 }

El siguiente ejemplo muestra cuántos usuarios estuvieron activos por última vez en cada mes.

El pipeline de agregación contiene las siguientes etapas:

  • $project etapa para extraer el mes del campo last_active como un número en el campo month_last_active

  • $group Etapa para agrupar documentos por el campo month_last_active y contar el número de documentos para cada mes.

  • $sort etapa para establecer un orden ascendente en el mes

let last_active_pipeline = vec![
doc! { "$project": { "month_last_active" : doc! { "$month" : "$last_active" } } },
doc! { "$group": doc! { "_id" : doc! {"month_last_active": "$month_last_active"} ,
"number" : doc! { "$sum" : 1 } } },
doc! { "$sort": { "_id.month_last_active" : 1 } }
];
let mut results = my_coll.aggregate(last_active_pipeline).await?;
while let Some(result) = results.try_next().await? {
println!("* {:?}", result);
}
* { "_id": { "month_last_active": 1 }, "number": 3 }
* { "_id": { "month_last_active": 5 }, "number": 4 }
* { "_id": { "month_last_active": 6 }, "number": 1 }
* { "_id": { "month_last_active": 7 }, "number": 1 }
* { "_id": { "month_last_active": 8 }, "number": 2 }
* { "_id": { "month_last_active": 11 }, "number": 1 }

El siguiente ejemplo encuentra los tres géneros más populares en función de la frecuencia con la que aparecen en los intereses de los usuarios.

El pipeline de agregación contiene las siguientes etapas:

  • $unwind etapa para separar cada entrada de arreglo en el campo genre_interests en un nuevo documento

  • $group etapa para agrupar documentos según el campo genre_interests y contar el número de documentos en cada género

  • $sort etapa para establecer un orden descendente en la popularidad del género

  • $limit aección para mostrar solo los tres primeros géneros

let popularity_pipeline = vec![
doc! { "$unwind" : "$genre_interests" },
doc! { "$group" : doc! { "_id" : "$genre_interests" , "number" : doc! { "$sum" : 1 } } },
doc! { "$sort" : doc! { "number" : -1 } },
doc! { "$limit": 3 }
];
let mut results = my_coll.aggregate(popularity_pipeline).await?;
while let Some(result) = results.try_next().await? {
println!("* {:?}", result);
}
* { "_id": "fiction", "number": 6 }
* { "_id": "memoir", "number": 5 }
* { "_id": "literary", "number": 4 }

Para aprender más sobre los conceptos mencionados en esta guía, consulta las siguientes entradas del manual del servidor:

Para obtener más información sobre el comportamiento del método aggregate(), consulta la sección Operaciones de agregación de la guía Recuperar datos.

Para obtener más información sobre cómo ordenar resultados dentro de un pipeline de agregación, consulta la guía de Ordenamiento.

Puedes realizar búsquedas de similitud en incrustaciones vectoriales mediante el uso de la funcionalidad de MongoDB Vector Search. Para saber más, consulta la guía de MongoDB Vector Search.

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: