Docs Menu
Docs Home
/ /

Transforma tus datos con agregación

En esta guía, puede aprender a utilizar PyMongo 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.

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.

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 Python desde el menú desplegable Select your language en la esquina superior derecha de la página.

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:

  • Realizar operaciones de búsqueda

  • Cambiar el nombre de los campos

  • Calcular campos

  • Resumir datos

  • Valores del grupo

Tenga en cuenta las siguientes limitaciones al utilizar 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 la canalización tienen un límite de memoria de 100 megabytes por defecto. Puedes superar este límite usando el allowDiskUse argumento de palabra clave del método aggregate().

Importante

Excepción $graphLookup

La etapa $graphLookup tiene un límite de memoria estricto de 100 megabytes e ignora el allowDiskUse parámetro.

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 Comience a utilizar 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 genera un recuento del número de panaderías en cada distrito de Nueva York. Para ello, utiliza una canalización de agregación con las siguientes etapas:

  • Una etapa $match para filtrar documentos cuyo cuisine campo contiene el "Bakery" valor.

  • Una etapa $group para agrupar los documentos coincidentes por el borough campo, 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 un resultado similar al 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}

Para ver información sobre cómo MongoDB ejecuta su operación, puede indicarle que la explique. Al explicar una operación, MongoDB 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 que explique una operación, MongoDB devuelve tanto el plan ejecutado como cualquier plan de ejecución rechazado.

Para explicar una operación de agregación, puede usar la biblioteca PyMongoExplain o un comando de base de datos. Seleccione la pestaña correspondiente a continuación para ver un ejemplo de cada método.

Utilice pip para instalar la biblioteca 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 utilizar el módulo pprint de Python para que los resultados de la explicación sean más fáciles de leer:

import pprint
...
pprint.pp(result)

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.

Para obtener más información sobre cómo ejecutar operaciones de agregación con PyMongo, consulte la siguiente documentación de API:

Volver

Query geoespacial

En esta página