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.