Aggregation expressions calculan valores dentro de stages. Reciben constantes, rutas de campos, variables y otras expressions, y producen un valor por documento o grupo.
Las expressions permiten transformar datos donde están almacenados, sin descargar documentos para realizar cálculos repetitivos en la aplicación. Cubren:
condiciones;
conversiones;
aritmética;
fechas;
strings;
arrays;
objetos;
conjuntos;
comparación;
reducción.
Su poder también puede producir pipelines densas y difíciles de verificar. La claridad es una restricción de diseño.
$ifNull puede tratar null y missing como ausencia. Eso es útil para presentación, pero puede ocultar schema drift. Para una auditoría, conserva información del tipo:
Existen expresiones como $toString, $toDate, $toObjectId y $toDecimal. Suelen fallar si la conversión no es válida, por lo que $convert es preferible en auditorías de datos inconsistentes.
No conviertas un valor inválido a cero: mezclaría errores con datos reales.
Para dinero, utiliza tipos consistentes como Decimal128 o unidades menores enteras. Una constante double dentro de una expression puede cambiar precisión:
JavaScript
{$multiply:['$total',0.19]}
Es más deliberado usar un decimal compatible cuando el campo es decimal.
Expressions permiten case conversion, trim y reemplazos. No sustituyen una estrategia de collation o search. Normalizar en cada query puede impedir índices y aumentar coste.
Expressions como $getField, $setField, $objectToArray y $arrayToObject permiten trabajar con keys dinámicas según versión.
Schemas con nombres de campos dinámicos pueden ser difíciles de indexar y validar. No utilices estas expressions para justificar un modelo arbitrario sin access patterns claros.
Arrays pueden tratarse como conjuntos con operaciones de unión, intersección o diferencia. La igualdad sigue semántica BSON y el orden del resultado no debe asumirse salvo documentación específica.
Expressions son funciones puras sobre valores BSON dentro de la pipeline. La precisión depende de tipos, null, timezone y contexto. $map, $filter, $reduce, $let, conversiones y condiciones permiten modelar transformaciones potentes, pero deben mantenerse legibles y verificables.
Comprueba lo aprendido
¿Qué diferencia existe entre '$price' y 'price'?
¿Cuándo usarías $convert en vez de $toDecimal?
¿Qué hacen $map, $filter y $reduce?
¿Cómo proteges división por cero?
¿Por qué importa la zona horaria?
¿Cuándo dividirías una expression en varios stages?