Overview
En esta guía, puede aprender a utilizar el controlador C++ para realizar operaciones de agregación.
Las operaciones de agregación procesan los datos de sus colecciones de MongoDB y devuelven resultados calculados. El marco de agregación de MongoDB, que forma parte de la API de consultas, se basa en el concepto de canalizaciones de procesamiento de datos. Los documentos entran en una canalización que contiene una o más etapas, y esta canalización los transforma en un resultado agregado.
Tip
Tutoriales completos sobre agregación
Puede encontrar tutoriales que brindan explicaciones detalladas de tareas de agregación comunes en Sección completa de tutoriales decanalización de agregación del manual del servidor. Seleccione un tutorial y luego seleccione C++11 desde el menú desplegable Select your language en la esquina superior derecha de la página.
Analogía
Una operación de agregación es similar a una fábrica de automóviles. Una fábrica de automóviles cuenta con una línea de ensamblaje, que contiene estaciones de ensamblaje con herramientas especializadas para realizar tareas específicas, como taladros y soldadores. Las piezas en bruto entran en la fábrica y luego la línea de ensamblaje las transforma y ensambla en un producto terminado.
La tubería de agregación es la línea de ensamblaje, las etapas de agregación son las estaciones de ensamblaje y las expresiones del operador son las herramientas especializadas.
Operaciones de agregación versus búsqueda
Se pueden utilizar las operaciones de búsqueda para realizar las siguientes acciones:
Seleccione qué documentos desea devolver
Seleccione qué campos desea devolver
Ordenar los resultados
Puede utilizar operaciones de agregación para realizar las siguientes acciones:
Ejecutar operaciones de búsqueda
Cambiar el nombre de los campos
Calcular campos
Resumir datos
Valores del grupo
Limitaciones
Tenga en cuenta las siguientes limitaciones al utilizar operaciones de agregación:
Los documentos devueltos no pueden violar el límite de tamaño de documento BSON de 16 megabytes.
Las etapas de la canalización tienen un límite de memoria de 100 megabytes por defecto. Puedes superar este límite configurando
allow_disk_usecampo de una instanciamongocxx::options::aggregateatrue.
Importante
Excepción $graphLookup
La etapa $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora el allow_disk_use campo.
Ejemplo de agregación
Nota
Los ejemplos de esta guía utilizan la restaurants colección sample_restaurants de la base de datos de 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 la guía "Comenzar con Atlas".
Para realizar una agregación, pasa una instancia de mongocxx::pipeline que contenga las etapas de agregación al método collection.aggregate().
El siguiente ejemplo de código genera un recuento del número de panaderías en cada distrito de Nueva York. Para ello, utiliza una canalización de agregación que consta de las siguientes etapas:
Etapa$match para filtrar los documentos en los que el
cuisinecampo contiene el valor"Bakery"Etapa de grupo para agrupar los documentos coincidentes por el
boroughcampo, acumulando un recuento de documentos para cada valor distinto
mongocxx::pipeline stages; stages.match(make_document(kvp("cuisine", "Bakery"))) .group(make_document(kvp("_id", "$borough"), kvp("count", make_document(kvp("$sum", 1))))); auto cursor = collection.aggregate(stages); for (auto&& doc : cursor) { std::cout << bsoncxx::to_json(doc) << std::endl; }
{ "_id" : "Brooklyn", "count" : 173 } { "_id" : "Queens", "count" : 204 } { "_id" : "Bronx", "count" : 71 } { "_id" : "Staten Island", "count" : 20 } { "_id" : "Missing", "count" : 2 } { "_id" : "Manhattan", "count" : 221 }
Explicar una agregación
Para ver información sobre cómo MongoDB ejecuta su operación, puede indicarle al planificador de consultas de MongoDB que la explique. Cuando MongoDB explica una operación, devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma en que MongoDB puede completar una operación. Al indicarle a MongoDB que explique una operación, devuelve tanto el plan ejecutado como cualquier plan de ejecución rechazado.
Para explicar una operación de agregación, ejecute el comando de base de datos explain especificando el comando en un documento BSON y pasándolo como argumento al método run_command().
El siguiente ejemplo le indica a MongoDB que explique la operación de agregación del Ejemplo de agregación anterior:
mongocxx::pipeline stages; stages.match(make_document(kvp("cuisine", "Bakery"))) .group(make_document(kvp("_id", "$borough"), kvp("count", make_document(kvp("$sum", 1))))); auto command = make_document( kvp("explain", make_document( kvp("aggregate", "restaurants"), kvp("pipeline", stages.view_array()), kvp("cursor", make_document())))); auto result = db.run_command(command.view()); std::cout << bsoncxx::to_json(result) << std::endl;
{ "explainVersion" : "2", "queryPlanner" : { "namespace" : "sample_restaurants.restaurants", "indexFilterSet" : false, "parsedQuery" : { "cuisine" : { "$eq" : "Bakery" } }, "queryHash": "...", "planCacheKey" : "...", "optimizedPipeline" : true, "maxIndexedOrSolutionsReached": false, "maxIndexedAndSolutionsReached" : false, "maxScansToExplodeReached" : false, "winningPlan" : { ... } ... }
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 explicar las operaciones de MongoDB, consulte Explicar los planesde salida y consulta.
Documentación de la API
Para obtener más información sobre cómo ejecutar operaciones de agregación con el controlador C++, consulte la siguiente documentación de API: