Uso de operadores set y project en MongoDB para formateo de datos

Clase 9 de 21Curso de MongoDB: Aggregation Framework

Contenido del curso

Resumen

Cuando trabajas con agregaciones en MongoDB, dar formato al resultado final es tan importante como obtener los datos correctos. El operador $set ofrece una alternativa poderosa al operador $project, y saber cuándo usar cada uno puede optimizar significativamente tu flujo de trabajo al construir pipelines de agregación.

¿Cuál es la diferencia entre set y project en MongoDB?

La distinción principal es sencilla pero crucial: mientras $project excluye automáticamente todos los campos que no declares de forma explícita, $set incluye por defecto todos los campos que ya existían en la etapa anterior del pipeline [01:00]. Esto significa que con $set no necesitas listar cada campo que deseas conservar.

  • $project es ideal cuando el resultado final requiere una modificación radical del documento original.
  • $set funciona mejor cuando necesitas agregar, modificar o computar campos nuevos basados en campos existentes.
  • Si tu documento original tiene pocos campos, $set ahorra tiempo.
  • Si el documento es extenso y complejo, $project ofrece un control más fino.

¿Cómo se usa el operador set para formatear reportes?

Partiendo de un pipeline que ya tiene datos agrupados con $group (donde se almacenaron propiedades como cantidad, precio media, más baja y más alta), el operador $set permite reorganizar esos datos sin perder ningún campo previo [02:24].

¿Cómo crear campos con nombres amigables?

Para generar un reporte legible, se pueden crear campos nuevos que hagan referencia a los datos existentes. Por ejemplo, un campo llamado "tipo de propiedad" puede apuntar al _id del grupo, y "cantidad de propiedades" puede referenciar al campo donde se almacenó la suma [03:20].

El operador $round resulta esencial para el formato numérico. Cuando los precios promedio vienen con demasiados decimales, este operador recibe un array con dos elementos: el campo numérico a formatear y la cantidad de decimales deseados [04:50]. Por ejemplo, aplicar $round con valor 2 al precio promedio entrega un resultado visualmente limpio con solo dos decimales.

¿Cómo crear objetos y arrays nuevos dentro de set?

Una de las capacidades más útiles de $set es la creación de estructuras que no existían previamente. En el ejemplo práctico, se construye un campo llamado "propiedades destacadas" que es un array con dos objetos [05:40]:

  • El primer objeto contiene el tipo (más baja), el nombre de la propiedad y su precio, referenciando $más_baja.name y $más_baja.price.
  • El segundo objeto sigue la misma estructura pero apunta a $más_alta.name y $más_alta.price.

Esta técnica permite agrupar datos relacionados dentro de una estructura nueva y organizada, algo especialmente valioso cuando se generan reportes con información anidada.

¿Cómo combinar set con project para limpiar el resultado?

Un efecto secundario de $set es que los campos originales permanecen visibles junto con los campos nuevos, generando duplicidad en el resultado [07:30]. La solución es agregar una etapa adicional con $project al final del pipeline, donde se excluyen los campos no deseados asignándoles el valor cero:

  • _id: 0 para ocultar el identificador.
  • precio_media: 0 porque ya existe como "precio promedio".
  • cantidad: 0 porque ya se muestra como "cantidad de propiedades".
  • más_baja: 0 y más_alta: 0 porque ya están dentro de "propiedades destacadas".

De esta forma, el resultado final muestra únicamente los campos formateados: tipo de propiedad, cantidad de propiedades, precio promedio redondeado y propiedades destacadas como un array limpio con los dos objetos.

Combinar ambos operadores en un mismo pipeline es una práctica recomendada que aprovecha lo mejor de cada uno: $set para construir y computar, $project para excluir y depurar.

Como ejercicio práctico, intenta agregar un campo nuevo que convierta el precio promedio de dólares a euros usando una operación aritmética dentro de $set. Comparte tus resultados en los comentarios.