reúne documentos que comparten una clave y produce un documento por grupo. Dentro del stage, los calculan sumas, conteos, promedios, mínimos, máximos, listas y otros resultados.
Sin $group, la aplicación tendría que transferir documentos y construir mapas en memoria. Agrupar en el servidor reduce datos devueltos y permite combinarlo con filtros, índices y otras transformaciones.
Ejemplo:
Texto
10.000 órdenes
→ agrupar por método de pago
→ 4 documentos de resultado
El coste depende de la cantidad de documentos y de la cardinalidad de la clave.
Según versión, existen acumuladores para top/bottom, primeros o últimos N y otras operaciones. Confirma soporte del servidor y FCV antes de depender de ellos.
Aun con APIs nuevas, el modelo mental se mantiene: ordenar, particionar y limitar cardinalidad.
El segundo caso puede consumir mucha memoria y producir un resultado tan grande como la entrada. Pregunta si realmente necesitas grouping o simplemente projection.
db.orders.aggregate([{$match:{
businessId,status:'confirmed',confirmedAt:{$gte: start,$lt: end }}},{$set:{day:{$dateTrunc:{date:'$confirmedAt',unit:'day',timezone:'America/Bogota'}}}},{$group:{_id:'$day',orderCount:{$sum:1},revenue:{$sum:'$total'},averageTicket:{$avg:'$total'}}},{$sort:{_id:1}}]);
La zona horaria define los límites del día comercial. Agrupar en UTC podría mover ventas nocturnas al día incorrecto.
En un sharded cluster, parte del grouping puede ejecutarse en shards y combinarse. El coste depende de shard key, distribución y si los datos relacionados están colocados.
Un group por campo no alineado con la shard key puede necesitar intercambio de datos entre nodos.
$group transforma un conjunto en grupos y acumulados. Su coste depende de cardinalidad y estado mantenido. Filtrar temprano, ordenar antes de first/last, controlar arrays acumulados y respetar tipos y zonas horarias son requisitos para resultados confiables.