Docs Menu
Docs Home
/ /
Operadores de tuberías de agregación

$let (operador de expresión)

$let

Se vincula variables para usar en la expresión especificada y devuelve el resultado de la expresión.

La expresión $let tiene la siguiente sintaxis:

{
$let:
{
vars: { <var1>: <expression>, ... },
in: <expression>
}
}
Campo
Especificación

vars

Bloque de asignación para las variables accesibles en la in expresión. Para asignar una variable, especifique una cadena como nombre y asigne una expresión válida al valor.

Las asignaciones de variables no tienen significado fuera de la expresión in, ni siquiera dentro del propio bloque vars.

in

La expresión que se evaluará.

Para acceder a las variables en expresiones de agregación, anteponga el nombre de la variable con dos signos de dólar$$ () y escríbalo entre comillas. Para obtener más información sobre las expresiones, consulte Expresiones. Para obtener información sobre el uso de variables en la canalización de agregación, consulte Variables en expresiones de agregación.

$let puede acceder a variables definidas fuera de su bloque de expresión, incluidas las variables del sistema.

Si modifica los valores de las variables definidas externamente en el bloque vars, los nuevos valores solo surten efecto en la expresión in. Fuera de la expresión in, las variables conservan sus valores anteriores.

En el vars bloque de asignación, el orden de asignación es irrelevante, y las asignaciones de variables solo tienen significado dentro de la in expresión. Por lo tanto, acceder al valor de una variable en el vars bloque de asignación se refiere al valor de la variable definida fuera del vars bloque y no dentro del mismo vars bloque.

Por ejemplo, considere la siguiente $let expresión:

{
$let:
{
vars: { low: 1, high: "$$low" },
in: { $gt: [ "$$low", "$$high" ] }
}
}

En el vars bloque"$$low" de asignación, se refiere al valor de una variable externa,low no a la variable definida en el mismo vars bloque. Si low no está definido fuera de este bloque de expresión, la expresión no es $let válida.

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$leten la etapa de canalización$projectpara calcular y devolver 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 }

Tip

Volver

$last (operador de matriz)

En esta página