从参考文献 $let (aggregation)
我们使用$let
来访问在其表达式之外定义的变量:
{
$let:
{
vars: { low: 1, high: "$$low" },
in: { $gt: [ "$$low", "$$high" ] }
}
}
在vars赋值块中,“$$ low”是指外部定义的变量low
的值,而不是同一vars块中定义的变量。如果未在$ let表达式块之外定义low
,则表达式无效。
我的问题:如何在外部定义变量low
?使用var
或其他选择?
答案 0 :(得分:3)
截至Now.Apart表单系统变量只能在MongoDB中创建聚合变量的方法有限。用户只能在$ let,$ redact,$ map操作中创建变量。 (参见手册:http://docs.mongodb.org/manual/reference/aggregation-variables/)
现在回答你的问题是,你可以在$ map中引用$ map或$ redact中定义的变量,这就是它们在MongoDB手册中的含义。
这里我举一个在$ let中使用$ map变量的例子:
> db.grades.find()
{ "_id" : 3, "quizzes" : [ 3, 8, 9 ] }
{ "_id" : 1, "quizzes" : [ 5, 6, 7 ] }
//Using a simple $map:
db.grades.aggregate([{
$project: {
adjustedGrades: {
$map: {
input: "$quizzes",
as: "grade",
in: { $add: [ "$$grade", 2 ] }
}
}
}
}]);
//Result:
{ "_id" : 3, "adjustedGrades" : [ 5, 10, 11 ] }
{ "_id" : 1, "adjustedGrades" : [ 7, 8, 9 ] }
现在定义$ let使用此$ map中定义的变量$$等级:
db.grades.aggregate([{
$project: {
adjustedGrades: {
$map: {
input: "$quizzes",
as: "grade",
in: {
$let: {
vars: { varin: "$$grade" },
in: { $add: [ "$$varin", 4 ] }
}
}
}
}
}
}]);
//Result:
{ "_id" : 3, "adjustedGrades" : [ 7, 12, 13 ] }
{ "_id" : 1, "adjustedGrades" : [ 9, 10, 11 ] }
答案 1 :(得分:2)
我最初在顶部错过了你声明的变量。您不需要做任何事情,实际值将是"插值"进入汇总管道文件"之前"它被发送到服务器:
var fenFactor = 100;
db.sales.aggregate( [
{
$project: {
finalTotal: {
$let: {
vars: {
total: { $add: [ '$price', '$tax' ] },
discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } }
},
in: { $multiply: [ "$$total", "$$discounted", fenFactor ] }
}
}
}
}
] );
所以直接使用变量,它将成为发送文档的一部分。
您可能还会认为$let
有点简洁,您无需重复使用这些变量。也许只是内联而已:
var fenFactor = 100;
db.sales.aggregate([
{ "$project": {
"finalTotal": {
"$multiply": [
{ "$add": [ "$price", "$tax" ] },
{ "$cond": [ "$applyDiscount", 0.9, 1 ]},
fenFactor
]
}
}}
]);