Las window functions calculan valores sobre documentos relacionados sin colapsarlos en un único resultado. En MongoDB se expresan principalmente mediante .
$setWindowFields
A diferencia de $group, cada documento puede permanecer en la salida mientras recibe un ranking, acumulado, promedio móvil o comparación con documentos vecinos.
Texto
$group
→ una salida por grupo
$setWindowFields
→ una salida por documento enriquecido
Sin ventanas, calcular un acumulado suele requerir agrupar, ejecutar lógica en la aplicación o hacer joins consigo misma. Window functions permiten expresar:
ranking de ventas;
saldo acumulado;
promedio móvil;
comparación con el periodo anterior;
posición dentro de una sucursal;
primer o último valor relacionado;
densidad y percentiles según operadores disponibles.
Incluye el documento actual y seis anteriores según el sort. Es útil para promedio de siete observaciones, no necesariamente siete días si faltan fechas.
Un índice compatible puede ayudar a entregar documentos en el orden requerido, pero $setWindowFields puede seguir necesitar memoria para particiones y ventanas. Revisa explain y datos reales.
[{$match:{
businessId,status:'confirmed',confirmedAt:{$gte: start,$lt: end }}},{$group:{_id:'$branchId',revenue:{$sum:'$total'},orders:{$sum:1}}},{$setWindowFields:{sortBy:{revenue:-1},output:{rank:{$rank:{}},shareOfRevenue:{$sum:'$revenue',window:{documents:['unbounded','unbounded']}}}}},{$set:{revenueShare:{$divide:['$revenue','$shareOfRevenue']}}}]
El nombre shareOfRevenue intermedio en realidad contiene el total global; convendría llamarlo totalRevenue para claridad. Los nombres deben expresar semántica, no solo operación.
$setWindowFields y acumuladores concretos dependen de la versión del servidor y FCV. No copies un ejemplo de documentación nueva a un cluster antiguo sin revisar compatibilidad.
Atlas, self-hosted y servicios compatibles pueden tener diferencias de versión o disponibilidad.
Window functions añaden contexto sin colapsar documentos. La partición define con quién se compara, el sort define la secuencia y la ventana define qué vecinos participan. La precisión conceptual depende de distinguir observaciones, tiempo, empates y límites.
Comprueba lo aprendido
¿Qué diferencia existe entre $group y una window function?
¿Cómo difieren rank y denseRank?
¿Por qué siete documentos no siempre representan siete días?
¿Qué ocurre en el primer documento con shift?
¿Cómo afecta una partición global?
¿Qué debes verificar antes de usar una función nueva?