Operadores Count y Average en MongoDB Aggregation Framework

Resumen

Si trabajas con MongoDB Aggregation Framework y necesitas contar documentos o calcular promedios dentro de tus reportes, los operadores $count y $avg son tus aliados. Aquí aprendes a usarlos dentro de la etapa $group para enriquecer un pipeline que analiza propiedades de Airbnb por tipo, mostrando cuántas hay y cuál es su precio medio.

¿Por qué los operadores de acumulación viven dentro de $group?

MongoDB Aggregation Framework tiene más de 50 operadores, y al principio puede ser confuso saber cuál usar y cuándo. La regla práctica es esta: los operadores de acumulación se utilizan dentro de la etapa $group, porque su trabajo es manipular y procesar los datos que estás agrupando.

En este caso vas a sumar dos requisitos al reporte que ya tenías de la clase anterior:

  • Contar cuántas propiedades hay por cada tipo (departamentos, casas, etc.).
  • Calcular el precio medio de cada tipo de propiedad.

¿Qué hace el operador $count en MongoDB? Cuenta los documentos que previamente agrupaste con $group. Se suele implementar usando $sum: 1 dentro de un campo nuevo.

¿Cómo cuento documentos con $sum dentro de $group?

Partes del pipeline que ya tenías en MongoDB Compass, donde el _id del $group es el tipo de propiedad. Para contar, creas un campo nuevo (por ejemplo, count) y le asignas el operador de acumulación $sum con el valor 1, lo que indica que sume una unidad por cada documento del grupo.

js { $group: { _id: "$property_type", count: { $sum: 1 } } }

Este campo todavía no aparece en el resultado final porque falta exponerlo en la etapa $project. Eso lo resolvemos al final.

¿Cómo calculo la media de precios con $avg?

Dentro del mismo $group agregas otro campo, llamémosle precioMedio, y usas el operador $avg indicando sobre qué campo quieres calcular el promedio. En tu caso, el campo price.

js { $group: { _id: "$property_type", count: { $sum: 1 }, precioMedio: { $avg: "$price" } } }

Recuerda que ambos operadores trabajan sobre los documentos agrupados, no sobre la colección completa. Por eso conviven dentro del mismo $group.

¿Cuál es la diferencia entre $sum y $avg? $sum suma valores (o cuenta si le pasas 1 fijo) y $avg calcula el promedio aritmético del campo que le indiques dentro del grupo.

¿Cómo expongo count y average en la etapa $project?

La etapa $project es donde modelas el resultado final del reporte. Aquí tienes que mapear los campos calculados a nombres amigables, igual que ya hiciste con el precio mínimo y máximo en la clase anterior.

js { $project: { cantidadPropiedades: "$count", precioPromedioPropiedades: "$precioMedio" } }

Apenas guardas la etapa, MongoDB Compass refleja el resultado en el panel lateral: por cada tipo de propiedad ves cuántas existen y cuál es su precio promedio, junto al resto de campos que ya tenías.

¿Qué otros acumuladores puedes probar?

Una vez entiendes el patrón, puedes incluir más acumuladores dentro de $group según lo que pida tu reporte. Algunos muy usados en estadística y data mining:

  1. $min para el valor mínimo de un campo.
  2. $max para el valor máximo.
  3. $sum para totales agregados.
  4. $avg para promedios.
  5. $count como etapa independiente cuando solo te interesa el conteo final.

La colección de Airbnb tiene bastantes campos numéricos donde puedes practicar: número de habitaciones, número de camas, calificaciones de reseñas. Juega con ellos y observa cómo cambian los resultados.

¿Qué debes recordar al armar pipelines con acumuladores?

Hay tres ideas que te ahorran errores comunes cuando combinas $group y $project:

  • Los acumuladores como $count y $avg solo tienen sentido dentro de $group, porque operan sobre conjuntos agrupados.
  • Si calculas un campo en $group pero no lo declaras en $project, no aparecerá en el reporte final.
  • Usa nombres descriptivos en $project (cantidadPropiedades, precioPromedioPropiedades) para que el resultado sea legible por quien consume el reporte.

En las siguientes clases vas a trabajar con formatos y operadores sobre objetos más complejos como arrays, donde el potencial del Aggregation Framework se nota todavía más. ¿Con qué campo de Airbnb vas a probar primero, $avg o $sum? Cuéntame en los comentarios.