Aggregation Pipeline es un sistema para transformar documentos mediante una secuencia ordenada de . Cada stage recibe documentos, realiza una operación y entrega documentos al siguiente.
La pipeline no es solo una sintaxis para reportes. Permite filtrar, calcular, unir, reorganizar, agrupar y analizar datos dentro del servidor, evitando transferir grandes conjuntos a la aplicación para procesarlos manualmente.
Supón que necesitas ventas diarias por método de pago. Una implementación ingenua podría:
leer todas las órdenes del mes;
enviarlas a Node.js;
recorrer items;
agrupar por fecha;
sumar totales;
ordenar;
devolver resultados.
Esto transfiere datos innecesarios, consume memoria en la aplicación y duplica una capacidad que MongoDB ya ofrece.
Pipeline:
JavaScript
db.orders.aggregate([{$match:{
businessId,status:'confirmed',confirmedAt:{$gte: start,$lt: end }}},{$group:{_id:{day:{$dateTrunc:{date:'$confirmedAt',unit:'day',timezone:'America/Bogota'}},method:'$payment.method'},orderCount:{$sum:1},revenue:{$sum:'$total'}}},{$sort:{'_id.day':1,'_id.method':1}}]);
Si solo necesitas filtro, projection, sort y limit, find() puede ser más simple. Aggregation se justifica cuando necesitas transformaciones, joins, grouping, window functions o múltiples salidas.
Eliminar campos grandes reduce payload interno, pero no debes proyectar fuera campos requeridos por stages posteriores. El optimizador puede mover algunas operaciones; aun así, escribe pipelines legibles y verifica el plan.
db.orders.aggregate([{$match:{
businessId,status:'confirmed',confirmedAt:{$gte: start,$lt: end }}},{$unwind:'$items'},{$group:{_id:'$items.productId',productName:{$last:'$items.nameAtPurchase'},units:{$sum:'$items.quantity'},revenue:{$sum:{$multiply:['$items.quantity','$items.unitPrice']}}}},{$sort:{revenue:-1}},{$limit:10}]);
Flujo:
$match restringe tenant, estado y fecha.
$unwind convierte cada item en una fila lógica.
$group agrupa por producto.
$sum calcula unidades e ingreso.
$sort ordena.
$limit conserva top 10.
El coste depende de órdenes coincidentes y total de items, no solo del número de órdenes.
Aggregation Pipeline es un flujo de transformación dentro del servidor. La calidad depende tanto de la semántica como del orden, cardinalidad, tipos, índices y memoria. Cada stage debe justificar qué recibe, qué produce y cuánto trabajo añade.
Comprueba lo aprendido
¿Qué diferencia existe entre stage y expression?
¿Por qué conviene filtrar temprano?
¿Qué stages suelen bloquear?
¿Cuándo find es suficiente?
¿Por qué allowDiskUse no es una optimización?
¿Qué cardinalidad produce $unwind sobre órdenes con muchos items?