$let (aggregation)

在本页面

Definition

$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

$map

首页