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 }