参考 > 参考 > 经营者 > 聚合管道运营商 > $ let(汇总)
在本页面
$let
绑定要在指定表达式中使用的变量,并返回表达式的结果。
该$let表达式具有以下语法:
{ $let: { vars: { <var1>: <expression>, ... }, in: <expression> } }
vars
表达式中可访问变量的分配块in。要分配变量,请为变量名称指定一个字符串,并为该值分配一个有效的表达式。
in
变量赋值在in 表达式之外没有意义,甚至在vars块本身内也没有意义。
要访问聚合表达式中的变量,请在变量名前加双美元符号($$)并用引号引起来。有关表达式的更多信息,请参见 表达式。有关在聚合管道中使用变量的信息,请参见 聚合表达式中的变量。
$$
$let可以访问在其表达式块之外定义的变量,包括系统变量。
如果修改vars块中外部定义的变量的值 ,则新值仅在in 表达式中生效。在in表达式之外,变量保留其先前的值。
在vars分配块中,分配顺序确实 不物质,将变量分配仅具有内侧意思in表达。这样,在vars赋值块中访问变量的值 是指在该vars块外部而不是在同vars一块内部定义的变量的值。
例如,考虑以下$let表达式:
{ $let: { vars: { low: 1, high: "$$low" }, in: { $gt: [ "$$low", "$$high" ] } } }
在vars分配块中,"$$low"指的是外部定义的变量的值,low而不是同vars一块中定义的变量。如果low未在此$let表达式块之外定义 ,则表达式无效。
"$$low"
low
一个sales集合了以下文件:
sales
{ _id: 1, price: 10, tax: 0.50, applyDiscount: true } { _id: 2, price: 10, tax: 0.25, applyDiscount: false }
以下聚合$let在 $project管道阶段用于计算并返回 finalTotal每个文档的:
$project
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 }
也可以看看
$map