Overview
En esta guía, puedes aprender a utilizar PyMongo para realizar operaciones de agregación.
Las operaciones de agregación procesan datos en tus colecciones de MongoDB y devuelven resultados calculados. El marco de agregación de MongoDB, que forma parte de la API de query, está basado en el concepto de pipelines de procesamiento de datos. Los documentos ingresan a un pipeline que contiene una o más etapas, y este pipeline transforma los documentos en un resultado agregado.
Una operación de agregación se asemeja a una fábrica de automóviles. Una fábrica de automóviles tiene 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 ingresan a la fábrica y luego la línea de montaje las transforma y ensambla en un producto terminado.
La pipeline de agregación es la cadena de ensamblaje, las etapas de agregación son las estaciones de ensamblaje y las expresiones de operadores son las herramientas especializadas.
Tip
Tutoriales completos sobre agregación
Puedes encontrar tutoriales que proporcionan explicaciones detalladas de tareas de agregación comunes en el Tutoriales completos del pipeline de agregación en el manual del servidor. Selecciona un tutorial y luego elige Python en el menú desplegable Select your language en la esquina superior derecha de la página.
Agregación versus operaciones de búsqueda
Se pueden utilizar las operaciones de búsqueda para realizar las siguientes acciones:
Seleccione qué documentos devolver
Seleccione qué campos devolver
Ordenar los resultados
Puedes utilizar operaciones de agregación para realizar las siguientes acciones:
Realizar operaciones de búsqueda
Renombrar campos
Calcular campos
Resumir datos
Agrupar valores
Limitaciones
Ten en cuenta las siguientes limitaciones al usar operaciones de agregación:
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. Puede superar este límite utilizando el
allowDiskUseargumento de palabra clave del métodoaggregate().
Importante
Excepción $graphLookup
La etapa $graphLookup tiene un límite estricto de memoria de 100 megabytes y no considera el parámetro allowDiskUse.
Ejemplo de agregación
Nota
Este ejemplo utiliza la colección sample_restaurants.restaurants de los conjuntos de datos de muestra Atlas. Para aprender cómo crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Comienza con PyMongo.
Para realizar una agregación, pase una lista de etapas de agregación al método collection.aggregate().
El siguiente ejemplo de código produce un recuento del número de panaderías en cada distrito de Nueva York. Para ello, utiliza una pipeline de agregación con las siguientes etapas:
Una etapa $match para filtrar documentos cuyo campo
cuisinecontenga el valor"Bakery".Una etapa $group para agrupar los documentos que coinciden por el campo
borough, acumulando un recuento de documentos para cada valor distinto.
Selecciona la pestaña Synchronous o Asynchronous para ver el código correspondiente:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the aggregation aggCursor = collection.aggregate(pipeline) # Print the aggregated results for document in aggCursor: print(document)
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the aggregation aggCursor = await collection.aggregate(pipeline) # Print the aggregated results async for document in aggCursor: print(document)
El ejemplo de código anterior produce una salida similar a la siguiente:
{'_id': 'Bronx', 'count': 71} {'_id': 'Brooklyn', 'count': 173} {'_id': 'Missing', 'count': 2} {'_id': 'Manhattan', 'count': 221} {'_id': 'Queens', 'count': 204} {'_id': 'Staten Island', 'count': 20}
Explica una agregación
Para ver información sobre cómo MongoDB ejecuta su operación, puede instruir a MongoDB para que explique la operación. Cuando MongoDB explica una operación, devuelve planes de ejecución y estadísticas de rendimiento. Un plan de ejecución es una forma potencial en que MongoDB puede completar una operación. Cuando instruyes a MongoDB para que explique una operación, devuelve tanto el plan que MongoDB ejecutó como cualquier plan de ejecución rechazado.
Para explicar una operación de agregación, puedes utilizar tanto la PyMongoExplain librería o un comando de base de datos. Seleccione la pestaña correspondiente a continuación para ver un ejemplo de cada método.
Utiliza pip para instalar la librería pymongoexplain, como se muestra en el siguiente ejemplo:
python3 -m pip install pymongoexplain
El siguiente ejemplo de código ejecuta el ejemplo de agregación anterior e imprime la explicación devuelta por MongoDB:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { "$match": { "cuisine": "Bakery" } }, { "$group": { "_id": "$borough", "count": { "$sum": 1 } } } ] # Execute the operation and print the explanation result = ExplainableCollection(collection).aggregate(pipeline) print(result)
... 'winningPlan': {'queryPlan': {'stage': 'GROUP', 'planNodeId': 3, 'inputStage': {'stage': 'COLLSCAN', 'planNodeId': 1, 'filter': {'cuisine': {'$eq': 'Bakery'}}, 'direction': 'forward'}}, ...
El siguiente ejemplo de código ejecuta el ejemplo de agregación anterior e imprime la explicación devuelta por MongoDB:
# Define an aggregation pipeline with a match stage and a group stage pipeline = [ { $match: { cuisine: "Bakery" } }, { $group: { _id: "$borough", count: { $sum: 1 } } } ] # Execute the operation and print the explanation result = database.command("aggregate", "collection", pipeline=pipeline, explain=True) print(result)
... 'command': {'aggregate': 'collection', 'pipeline': [{'$match': {'cuisine': 'Bakery'}}, {'$group': {'_id': '$borough', 'count': {'$sum': 1}}}], 'explain': True, ...
Tip
Puede usar el módulo pprint de Python para que los resultados de las explicaciones sean más fáciles de leer:
import pprint ... pprint.pp(result)
Información Adicional
Manual del Servidor de MongoDB
Para obtener una lista completa de las etapas de agregación, consulta Etapas de agregación en el manual de MongoDB Server.
Para aprender sobre la creación de un pipeline de agregación y ver ejemplos, consulta Pipeline de agregación.
Para obtener más información sobre cómo explicar las operaciones de MongoDB, consulta Resultado de explicación y Planes de consultas.
Documentación de la API
Para obtener más información sobre la ejecución de operaciones de agregación con PyMongo, consulta la siguiente documentación de la API: