Definición
$letBinds variables para utilizar en la expresión especificada y devuelve el resultado de la expresión.
La
$letLa expresión tiene la siguiente sintaxis:{ $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 propio 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 las 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, considera la siguiente expresión $let:
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
En el bloque de asignación vars, "$$low" se refiere al valor de una variable externa definida low y no a la variable definida en el mismo bloque vars. Si low no está definido fuera de este bloque de expresiones $let, la expresión es invá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 $let en la $project etapa de la pipeline para calcular y devolver el/la finalTotal 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 }