$如何在mongoDB中将访问变量定义在其表达式之外?

时间:2015-09-15 09:02:07

标签: mongodb mongodb-query aggregation-framework

从参考文献 $let (aggregation)

我们使用$let来访问在其表达式之外定义的变量:

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

在vars赋值块中,“$$ low”是指外部定义的变量low的值,而不是同一vars块中定义的变量。如果未在$ let表达式块之外定义low,则表达式无效。

我的问题:如何在外部定义变量low?使用var或其他选择?

2 个答案:

答案 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
            ]
         }
      }}
    ]);