Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

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:

  • Comparar operaciones de agregación y búsqueda describe las diferencias de funcionalidad entre las operaciones de agregación y búsqueda.

  • Limitaciones del servidor describe las limitaciones del servidor sobre el uso de memoria para las operaciones de agregación

  • Ejemplos proporciona ejemplos de agregaciones para diferentes casos de uso

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

Tip

Tutoriales completos sobre agregación

Puede encontrar tutoriales que brindan explicaciones detalladas de tareas comunes de agregación en la sección Tutoriales completos de pipeline 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 enumera las diferentes tareas que se pueden realizar con las operaciones de búsqueda, en comparación con las que se pueden lograr con las operaciones de agregación. El marco de agregación ofrece una funcionalidad ampliada que permite transformar y manipular los datos.

Operaciones de búsqueda
Operaciones de agregación
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Select certain documents to return
Select which fields to return
Sort the results
Limit the results
Count the results
Rename fields
Compute new fields
Summarize data
Connect and merge data sets

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 de pipeline tienen un límite de memoria de 100 megabytes por defecto. Si es necesario, puede superar este límite configurando allow_disk_use. campo en tu 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 según 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 por el campo genre_interests y contar el número de documentos para cada género

  • $sort escenario para establecer una clasificación descendente según 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 el Sección Operaciones de agregación de la guía de Recuperación de datos.

Para obtener más información acerca de cómo ordenar resultados en un pipeline de agregación, consulta la guía Ordenar resultados.

Puede realizar búsquedas de similitud en incrustaciones vectoriales mediante la función de Búsqueda de Vectores de MongoDB. Para obtener más información, consulte la guía de Búsqueda de Vectores de MongoDB.

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:

Volver

Validación de esquema

En esta página