文章目录
- MongoDB聚合运算符:$let
- 语法
- 使用
- 举例
MongoDB聚合运算符:$let
$let聚合运算符绑定用于表示计算的变量,并返回表达式的结果。
语法
{$let:{vars: { <var1>: <expression>, ... },in: <expression>}
}
vars用于在in表达式中变量的赋值块,为变量赋值,使用字符串指定变量名并为其关联一个表达式作为值。赋值块在in表达式外以及vars块内部都没有意义。in要计算的表达式。
要访问聚合表达式中的变量,需要在变量名称前添加双美元符号 ($$) 并用引号引起来。
使用
$let可以访问其表达式块之外定义的变量,包括系统变量。
如果在vars块中修改外部定义变量的值,则新值仅在in表达式中生效,在in表达式之外,变量保留其先前的值。
在vars赋值块中,赋值的顺序并不重要,变量赋值仅在in表达式内部有意义,因此,访问vars赋值块中的变量值是指在vars块外部而不是在同一vars块内部定义的变量的值。举例:
{$let:{vars: { low: 1, high: "$$low" },in: { $gt: [ "$$low", "$$high" ] }}
}
在vars赋值块中,"$$low"是指外部定义的变量low的值,而不是同一vars块中定义的变量。如果low在$let达式块之外没有定义,表达式无效。
举例
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 }