$let(聚合)
定义
$let
绑定 变量用于指定表达式,并返回表达式的结果。
$let
表达式的语法如下:{ $let: { vars: { <var1>: <expression>, ... }, in: <expression> } } 字段规范vars
可在
in
表达式中访问变量的赋值区块。要为变量赋值,请为变量名称指定一个字符串,并为该值分配一个有效的表达式。在
in
表达式之外,变量赋值没有任何意义,哪怕在vars
区块内也没有意义。in
要评估的表达式。
要访问聚合表达式中的变量,请在变量名称前加上双美元符号 (
$$
) 并用引号引起来。有关表达式的更多信息,请参阅《表达式运算符》。有关在聚合管道中使用变量的信息,请参阅《聚合表达式中的变量》。
行为
$let
可以访问在其表达式块之外定义的变量,包括系统变量。
如果在 vars
区块中修改外部定义的变量的值,则新值仅在 in
表达式中有效。在 in
表达式之外,变量仍为之前的值。
在 vars
赋值区块中,赋值的顺序并不重要,变量赋值仅在 in
表达式中有意义。因此,访问 vars
赋值区块中的变量值是指在 vars
区块外部定义的变量值,而不是在同一 vars
区块内定义的变量值。
例如,请看下述 $let
表达式:
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
在 vars
赋值块中,"$$low"
是指外部定义的变量 low
的值,而不是同一 vars
区块中定义的变量。如果 $let
表达式块之外没有定义 low
,则该表达式无效。
例子
集合 sales
包含以下文档:
{ _id: 1, price: 10, tax: 0.50, applyDiscount: true } { _id: 2, price: 10, tax: 0.25, applyDiscount: false }
以下聚合在 $project
管道阶段使用 $let
来计算并返回每个文档的 finalTotal
:
db.sales.aggregate( [ { $project: { finalTotal: { $let: { vars: { total: { $add: [ '$price', '$tax' ] }, discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } } }, in: { $multiply: [ "$$total", "$$discounted" ] } } } } } ] )
该聚合返回以下结果:
{ "_id" : 1, "finalTotal" : 9.450000000000001 } { "_id" : 2, "finalTotal" : 10.25 }