On this page
$let (aggregation)
在本页面
Definition
$let
- 绑定variables以在指定的表达式中使用,并返回表达式的结果。
$let表达式具有以下语法:
{
$let:
{
vars: { <var1>: <expression>, ... },
in: <expression>
}
}
Field | Specification |
---|---|
vars |
在in 表达式中可访问的variables的分配块。要分配变量,请为变量名称指定一个字符串,并为该值分配一个有效的表达式。 |
变量赋值在in
表达式之外,甚至在vars
块本身内,都没有任何意义。
| in
|要评估的expression。
要访问聚合表达式中的变量,请在变量名前加双美元符号($$
),并用引号引起来。有关表达式的更多信息,请参见Expressions。有关在聚合管道中使用变量的信息,请参见聚合表达式中的变量。
Behavior
$let可以访问在其表达式块之外定义的变量,包括system variables。
如果在vars
块中修改外部定义的变量的值,则新值仅在in
表达式中生效。在in
表达式之外,变量保留其先前的值。
在vars
赋值块中,赋值的 Sequences 无关紧要,变量赋值仅在in
表达式内具有含义。这样,在vars
赋值块中访问变量的值是指在vars
块外部定义的变量的值,并且是在同一vars
块内部**否的变量。
例如,考虑以下$let表达式:
{
$let:
{
vars: { low: 1, high: "$$low" },
in: { $gt: [ "$$low", "$$high" ] }
}
}
在vars
分配块中,"$$low"
是指外部定义的变量low
的值,而不是在同一vars
块中定义的变量。如果在此$let表达式块之外未定义low
,则该表达式无效。
Example
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 }
See also