El pipeline de agregación es el mecanismo más poderoso de MongoDB para transformar y analizar datos. A diferencia deDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/tutosrive/db-nosql-2026-1/llms.txt
Use this file to discover all available pages before exploring further.
find(), que simplemente filtra y proyecta documentos, el pipeline permite encadenar múltiples operaciones: agrupar por campo, calcular promedios, renombrar campos, hacer joins entre colecciones y mucho más. Cada etapa recibe el resultado de la anterior y entrega una salida transformada a la siguiente, formando una tubería de procesamiento.
El Pipeline de Agregación
El métodoaggregate() recibe un arreglo de etapas. Los documentos de la colección entran por la primera etapa, se transforman, y el resultado fluye hacia la siguiente.
El orden de las etapas importa. Por ejemplo, colocar
$match al principio del pipeline reduce el número de documentos que procesan las etapas siguientes, mejorando el rendimiento considerablemente.Etapas Principales
| Etapa | Descripción |
|---|---|
$match | Filtra documentos (como find) |
$group | Agrupa por un campo y calcula acumuladores |
$project | Selecciona, renombra o calcula campos |
$sort | Ordena documentos |
$limit | Limita el número de resultados |
$skip | Salta documentos |
$unwind | Descompone arreglos en documentos individuales |
$lookup | JOIN entre colecciones |
$group: Agrupar Documentos
La etapa$group es el núcleo de la agregación. Agrupa los documentos por el valor de _id y calcula acumuladores para cada grupo.
Pista clave: Cuando el enunciado dice “por cada” o “para cada”, normalmente se necesita un
$group.Ejemplo base: Contar personas por género
- Forma 1 — _id directo
- Forma 2 — _id como objeto
- Forma 3 — con $sort
Proyectar la salida con $project
Para controlar los nombres de los campos en el resultado final, se combina$group con $project:
Acumuladores en $group
Los acumuladores son funciones que calculan un valor a partir de todos los documentos del mismo grupo.| Acumulador | Descripción | Ejemplo |
|---|---|---|
$sum | Suma | { $sum: 1 } o { $sum: "$campo" } |
$avg | Promedio | { $avg: "$dob.age" } |
$max | Valor máximo | { $max: "$dob.age" } |
$min | Valor mínimo | { $min: "$dob.age" } |
$push | Arreglo con todos los valores del grupo | { $push: "$nombre" } |
$first | Primer valor del grupo | { $first: "$nombre" } |
$last | Último valor del grupo | { $last: "$nombre" } |
Ejercicios de Agregación
Los siguientes ejercicios fueron trabajados en clase con la colecciónpersonas. Cada uno introduce una nueva combinación de etapas.
Ejercicio 1 — Top 50 nacionalidades con más personas
Ejercicio 2 — Top 50 con proyección (nacionalidad y conteo)
Ejercicio 3 — Top 5 ciudades con menos personas, ordenadas
Primero, las ciudades con menor número de personas:Ejercicio 4 — Número de personas por género y nacionalidad
Ejercicio 5 — Promedio de edades por género y nacionalidad, top 5
Ejercicio 6 — Filtrar mayores de 20, agrupar por género y ciudad con múltiples acumuladores
Ejercicio 7 — Por nacionalidad y estado, total de personas ≥ 10
Este ejercicio usa$match después de $group para filtrar grupos que no cumplan una condición de acumulador.
El
$match post-$group filtra sobre el resultado del grupo (por ejemplo, sobre total). El $match pre-$group filtra los documentos originales antes de agrupar. Ambos usos son válidos y frecuentes.$project: Proyectar en el Pipeline
La etapa$project dentro del pipeline tiene más capacidades que la proyección de find(): permite renombrar campos, calcular expresiones y concatenar strings.
Proyección básica con campos calculados
Proyección con edad de registro y descripción de la localización
$match con Condiciones
$match al inicio del pipeline actúa igual que find(), pero al estar dentro del pipeline su resultado fluye hacia las etapas siguientes.
Ejercicio — Proyectar personas de género masculino entre 15 y 20 años
Enunciado: Proyectar en un solo campo el título de la persona y el apellido en un campo llamado nombre para las personas de sexo masculino cuya edad de registro esté entre 15 y 20 años inclusive, límite de 500, ordenados por el apellido ascendentemente.