如何在Scala的MongoDB聚合查询中使用'$ let'?

时间:2019-09-27 03:37:17

标签: mongodb scala aggregation-framework

我正在尝试在Scala中编写mongoDB聚合查询。

在“ $ project”阶段如何编写Scala代码以使用“ $ let”?

我想知道是否应该使用Variable。不确定如何?

'$project': {
  'myprojitem' :{
     '$let': {
          'vars' : { 'myVariable1': { '$or': [...] } }
          'in' : {
            '$cond': [
                '$$myVariable1',
                { ... },
                { ... },
            ]
    }
}

2 个答案:

答案 0 :(得分:1)

我想出了答案。希望它可以帮助某人。

val doc : Document = Document("{
     '$let': {
          'vars' : { 'myVariable1': { '$or': [...] } },
          'in' : { '$cond': ['$$myVariable1',{ ... },{ ... } ]
     }     

    }")

    var pipeline = mutable.Buffer[Bson]()
    pipeline += Aggregates.project(Projections.fields(
      Projections.computed("myprojitem",doc)
    ))

基本上,每个{name:expression}都可以写成:

Document("name" -> expression)

Document( "{name : expression}")

答案 1 :(得分:0)

$let用于将变量绑定到结果obj。语法遵循规则:

{
  $let:
     {
       vars: { <var1>: <expression>},
       in: <expression>
     }
}

仅是细节,您应该看看$let (aggregation) definition from mongodb manual

这里是一个教科书示例,旨在使您更加理解:

请考虑以下数据:

{ _id: 1, price: 10, tax: 0.50, applyDiscount: true }
{ _id: 2, price: 10, tax: 0.25, applyDiscount: false }

想象一下,我们想通过以下方式为finalTotal生成结果:

enter image description here

如果applyDiscount: true,则Disc = 10%,否则为0。

因此,我们现在需要在数据上创建聚合以构建此等式。这样我们可以得到如下结果:

{ _id: 1, finalTotal: 9.45 }
{ _id: 2, finalTotal: 10.25 }

我们可以这样做:

      $project: {
         finalTotal: {
            $let: {
               vars: {
                  total: { $add: [ '$price', '$tax' ] },
                  discounted: { $cond: { if: '$applyDiscount', then: (0.9, else: 1 } }
               },
               in: { $multiply: [ "$$total", "$$discounted" ] }
            }
         }
      }


我们可以对此进行细分:

第1步。将价格加税到一个名为total的变量

total: { $add: [ '$price', '$tax' ] },


第2步。以数字形式转换条件(变量discounted

discounted: { $cond: { if: '$applyDiscount', then: 0.9, else: 1 } }


步骤3。在构造的$multiply$$total之间执行操作$$discounted

in: { $multiply: [ "$$total", "$$discounted" ] }