我正在尝试在Scala中编写mongoDB聚合查询。
在“ $ project”阶段如何编写Scala代码以使用“ $ let”?
我想知道是否应该使用Variable。不确定如何?
'$project': {
'myprojitem' :{
'$let': {
'vars' : { 'myVariable1': { '$or': [...] } }
'in' : {
'$cond': [
'$$myVariable1',
{ ... },
{ ... },
]
}
}
答案 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
生成结果:
如果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" ] }