$let (agregação)
Nesta página
Definição
$let
Vincula variáveis para utilizar na expressão especificada e retorna o resultado da expressão.
A expressão
$let
tem a seguinte sintaxe:{ $let: { vars: { <var1>: <expression>, ... }, in: <expression> } } CampoEspecificaçãovars
Bloco de atribuição para as variáveis acessíveis na expressão
in
. Para atribuir uma variável, especifique uma string para o nome da variável e atribua uma expressão válida para o valor.As atribuições de variáveis não têm significado fora da expressão
in
, nem mesmo dentro do próprio blocovars
.in
A expressão para avaliar.Para acessar variáveis em expressões de agregação, prefixe o nome da variável com sinais de dólar duplo (
$$
) e entre aspas. Para mais informações sobre expressões, consulte Expressões. Para obter informações sobre o uso de variáveis no pipeline de agregação, consulte Variáveis em Expressões de agregação.
Comportamento
$let
pode acessar variáveis definidas fora de seu bloco de expressão, incluindo variáveis do sistema.
Se você modificar os valores de variáveis definidas externamente no bloco vars
, os novos valores terão efeito somente na expressão in
. Fora da expressão in
, as variáveis retêm seus valores anteriores.
No bloco de atribuição vars
, a ordem da atribuição não importa, e as atribuições de variáveis só têm significado dentro da expressão in
. Como tal, acessar o valor de uma variável no bloco de tarefa vars
refere-se ao valor da variável definida fora do bloco vars
e não dentro do mesmo bloco vars
.
Por exemplo, considere a seguinte expressão $let
:
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
No bloco de atribuição vars
, "$$low"
se refere ao valor de uma variável definida externamente low
e não à variável definida no mesmo bloco vars
. Se low
não for definido fora desse bloco de expressão $let
, a expressão será inválida.
Exemplo
Uma coleção sales
tem os seguintes documentos:
{ _id: 1, price: 10, tax: 0.50, applyDiscount: true } { _id: 2, price: 10, tax: 0.25, applyDiscount: false }
A agregação a seguir usa $let
no estágio de pipeline $project
para calcular e retornar o 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" ] } } } } } ] )
A agregação retorna os seguintes resultados:
{ "_id" : 1, "finalTotal" : 9.450000000000001 } { "_id" : 2, "finalTotal" : 10.25 }