Overview
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.
Analogía
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.
Comparar las operaciones de agregación y búsqueda
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 |
Limitaciones del servidor
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.
Ejemplos
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" } }
Perspectivas de edad por género
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
$unwindpara separar cada entrada de arreglo en el campogenre_interestsen un nuevo documento.Una etapa
$grouppara agrupar documentos por valor del campogenre_interests. Esta etapa encuentra la edad promedio, mínima y máxima de los usuarios utilizando los operadores$avg,$miny$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 }
Agrupar por componente de tiempo
El siguiente ejemplo muestra cuántos usuarios estuvieron activos por última vez en cada mes.
El pipeline de agregación contiene las siguientes etapas:
$projectetapa para extraer el mes del campolast_activecomo un número en el campomonth_last_active$groupEtapa para agrupar documentos por el campomonth_last_activey contar el número de documentos para cada mes.$sortetapa 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 }
Calcula los géneros populares
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:
$unwindetapa para separar cada entrada de arreglo en el campogenre_interestsen un nuevo documento$groupEtapa para agrupar documentos por el campogenre_interestsy contar el número de documentos para cada género$sortescenario para establecer una clasificación descendente según la popularidad del género$limitaecció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 }
Información Adicional
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.
Búsqueda vectorial de MongoDB
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.
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: