Definición
$letVincula variables para su uso en la expresión especificada y devuelve el resultado de la expresión.
La expresión tiene la siguiente
$letsintaxis:{ $let: { vars: { <var1>: <expression>, ... }, in: <expression> } } CampoEspecificaciónvarsBloque de asignación para las variables accesibles en la expresión
in. Para asignar una variable, especifica una string para el nombre de la variable y asigna una expresión válida para el valor.Las asignaciones de variables no tienen significado fuera de la expresión
in, ni siquiera dentro del mismo bloquevars.inLa expresión que se evaluará.
Para acceder a las variables en expresiones de agregación, antepone el nombre de la variable con double signo de dólar (
$$) y colóquelo entre comillas. Para obtener más información sobre las expresiones, consulta Expresiones. Para información sobre el uso de variables en la pipeline de agregación, consulte Variables en las expresiones de agregación.
Comportamiento
$let puede acceder a variables definidas fuera de su bloque de expresión, incluidas las variables del sistema.
Si modificas los valores de variables definidas externamente en el bloque vars, los nuevos valores sólo tendrán efecto en la expresión in. Fuera de la expresión in, las variables retienen sus valores anteriores.
En el bloque de asignación vars, el orden de la asignación no importa, y las asignaciones de variables solo tienen sentido dentro de la expresión in. Por lo tanto, acceder al valor de una variable en el bloque de asignación vars se refiere al valor de la variable definida fuera del bloque vars y no dentro del mismo bloque vars.
Por ejemplo, considere la siguiente $let expresión:
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
En el vars bloque de asignación, "$$low" se refiere al valor de una variable low definida externamente y no a la variable definida en el mismo vars bloque. Si low no está definida fuera de este bloque de expresión, la expresión no es $let válida.
Ejemplo
Una colección sales tiene los siguientes documentos:
db.sales.insertMany( [ { _id: 1, price: 10, tax: 0.50, applyDiscount: true }, { _id: 2, price: 10, tax: 0.25, applyDiscount: false } ] )
La siguiente agregación utiliza en $let $project la etapa de canalización para calcular y devolver finalTotal el para cada documento:
db.sales.aggregate( [ { $project: { finalTotal: { $let: { vars: { total: { $add: [ '$price', '$tax' ] }, discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } } }, in: { $multiply: [ "$$total", "$$discounted" ] } } } } } ] )
La agregación devuelve los siguientes resultados:
{ "_id" : 1, "finalTotal" : 9.450000000000001 } { "_id" : 2, "finalTotal" : 10.25 }