Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

$let(聚合)

在此页面上

  • 定义
  • 行为
  • 例子
$let

绑定用于指定表达式的变量,并返回表达式的结果。

$let 表达式的语法如下:

{
$let:
{
vars: { <var1>: <expression>, ... },
in: <expression>
}
}
字段
规范
vars

可在 in 表达式中访问变量的赋值区块。要为变量赋值,请为变量名称指定一个字符串,并为该值分配一个有效的表达式。

in 表达式之外,变量赋值没有任何意义,哪怕在 vars 区块内也没有意义。

in
要评估的表达式

要访问聚合表达式中的变量,请在变量名称前加上双美元符号 ($$) 并用引号引起来。有关表达式的更多信息,请参阅表达式。 有关在聚合管道中使用变量的信息,请参阅《聚合表达式中的变量》

$let 可以访问在其表达式块之外定义的变量,包括系统变量

如果在 vars 区块中修改外部定义的变量的值,则新值仅在 in 表达式中有效。在 in 表达式之外,变量仍为之前的值。

vars 赋值区块中,赋值的顺序并不重要,变量赋值仅在 in 表达式中有意义。因此,访问 vars 赋值区块中的变量值是指在 vars 区块外部定义的变量值,而不是在同一 vars 区块内定义的变量值。

例如,请看下述 $let 表达式:

{
$let:
{
vars: { low: 1, high: "$$low" },
in: { $gt: [ "$$low", "$$high" ] }
}
}

vars 赋值块中,"$$low" 是指外部定义的变量 low 的值,而不是同一 vars 区块中定义的变量。如果 $let 表达式块之外没有定义 low,则该表达式无效。

集合 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 }

提示

另请参阅:

后退

$last(数组操作符)

来年

$literal

在此页面上