Overview
En esta guía, puede aprender a utilizar el controlador MongoDB.NET/C# para realizar operaciones de agregación.
Las operaciones de agregación procesan los datos en las colecciones de MongoDB y devuelven resultados calculados. El marco de agregación de MongoDB está modelado según el concepto de pipeline de procesamiento de datos. Los documentos entran en un pipeline compuesto por una o varias etapas, y este pipeline transforma los documentos en un resultado agregado.
Analogía
Las operaciones de agregación funcionan de forma similar a las fábricas de automóviles con líneas de montaje. Estas líneas cuentan con estaciones con herramientas especializadas para realizar tareas específicas. Por ejemplo, al fabricar un automóvil, la línea de montaje comienza con el chasis. A medida que este avanza por la línea, cada estación ensambla una pieza independiente. El resultado es un producto final transformado: el automóvil terminado.
La línea de ensamblaje representa la cadena de agregación, las estaciones individuales representan las etapas de agregación, las herramientas especializadas representan los operadores de expresión y el producto terminado 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 Group the results Rename fields Compute new fields Summarize data Connect and merge data sets |
Limitaciones del servidor
Considere lo siguiente Limitaciones al realizar operaciones de agregación:
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 la propiedad AllowDiskUse del
AggregateOptionsobjeto que pasa al métodoAggregate().La etapa $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora la
AllowDiskUsepropiedad.
Ejemplo de agregación
Para realizar una agregación, pase una lista de etapas de agregación al método IMongoCollection<TDocument>.Aggregate().
Nota
Este ejemplo utiliza la colección de sample_restaurants.restaurants los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulte Inicio rápido.
El siguiente ejemplo de código genera un recuento del número de panaderías en cada distrito de la ciudad de Nueva York. Para ello, utiliza una canalización de agregación que consta de las siguientes etapas:
Una etapa $match para filtrar documentos cuyo
cuisinecampo contiene el"Bakery"valor.Una etapa de $group para agrupar los documentos coincidentes por el
boroughcampo, acumulando un recuento de documentos para cada valor distinto de ese campo.
Las siguientes secciones implementan este ejemplo mediante el uso de los enfoques LINQ, Builders y BsonDocument para crear y combinar las etapas de agregación utilizadas en la canalización de ejemplo.
Enfoque LINQ
// Defines a queryable collection object as a prerequisite to using LINQ var queryableCollection = collection.AsQueryable(); // Defines the query with $match and $group stages var query = queryableCollection .Where(r => r.Cuisine == "Bakery") .GroupBy(r => r.Borough) .Select(g => new { _id = g.Key, Count = g.Count() }); // Executes the query and prints the aggregated results foreach (var result in query.ToList()) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
Para obtener más información sobre el uso de LINQ para construir canales de agregación, consulte la guía Sintaxis LINQ para operaciones de agregación.
Enfoque de los constructores
// Defines the $match aggregation stage var matchFilter = Builders<Restaurant>.Filter.Eq(r => r.Cuisine, "Bakery"); // Defines the aggregation pipeline with the $match and $group aggregation stages var pipeline = new EmptyPipelineDefinition<Restaurant>() .Match(matchFilter) .Group(r => r.Borough, g => new { _id = g.Key, Count = g.Count() } ); // Executes the aggregation pipeline var results = collection.Aggregate(pipeline).ToList(); // Prints the aggregated results foreach (var result in results) { Console.WriteLine(result); }
{ _id = Bronx, Count = 71 } { _id = Brooklyn, Count = 173 } { _id = Staten Island, Count = 20 } { _id = Missing, Count = 2 } { _id = Manhattan, Count = 221 } { _id = Queens, Count = 204 }
Para obtener más información sobre el uso de constructores para construir canalizaciones de agregación, consulte la sección Construir una canalización de agregación de la guía Operaciones con constructores.
Enfoque de BsonDocument
// Defines the $match and $group aggregation stages var matchStage = new BsonDocument { { "$match", new BsonDocument { { "cuisine", "Bakery" } } } }; var groupStage = new BsonDocument { { "$group", new BsonDocument { { "_id", "$borough" }, { "count", new BsonDocument("$sum", 1) } } } }; // Executes the aggregation pipeline var pipeline = new[] { matchStage, groupStage }; var results = collection.Aggregate<BsonDocument>(pipeline).ToList(); // Prints the aggregated results foreach (BsonDocument result in results) { Console.WriteLine(result); }
{ "_id" : "Brooklyn", "count" : 173 } { "_id" : "Manhattan", "count" : 221 } { "_id" : "Bronx", "count" : 71 } { "_id" : "Missing", "count" : 2 } { "_id" : "Staten Island", "count" : 20 } { "_id" : "Queens", "count" : 204 }
Información Adicional
Manual del servidor MongoDB
Para obtener una lista completa de las etapas de agregación, consulta Etapas de agregación en el manual de MongoDB Server.
Para obtener más información sobre cómo ensamblar una canalización de agregación y ver ejemplos, consulte Canalización de agregación.
Para obtener más información sobre cómo crear etapas de canalización, consulte Etapas de agregación.
Para obtener más información sobre cómo explicar las operaciones de agregación de MongoDB, consulte Explicar resultados y planes de consulta.
Documentación de la API
Para obtener más información sobre las operaciones de agregación analizadas en esta guía, consulte la siguiente documentación de API: