是否可以在Java Spring中进行条件聚合?

时间:2019-07-02 07:47:10

标签: java spring mongodb hibernate

我正在将Spring和MongoDB与MongoTemplate结合使用。

我有这份文件:

{
  price: 50.0,
  goal: {
       currentValue: 20,
       goal: 100
  }
}

我需要执行一个查询,例如“ 为我提供其当前值与目标相同的值”或“ 给我提供其当前值为50%的文档”目标”。

是否可以这样做?到目前为止,我一直在进行这种查询,但从未进行过有条件的查询,该查询使用文档的当前值作为条件的一部分。

Criteria criteria = Criteria.where("price").exists(true);

GroupOperation totalAggregation = group()
      .sum("goal.currentValue")
      .as("currentValue")
      .sum("goal.goal")
      .as("goal");
UnwindOperation unwind = unwind("$goal");
Aggregation aggregation = newAggregation(match(criteria), unwind, totalAggregation);

AggregationResults<Document> results = mongoTemplate
                .aggregate(aggregation,"Goals", Document.class);

现在,我只想将它们带入我上面所述的场景中。该怎么做?

谢谢。

2 个答案:

答案 0 :(得分:1)

由于可以使用MongoDB 4.0.1,因此可以使用$expr获得所需的结果。

所需查询如下:

db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , "$goal.goal" ] } } )

或者,如果您需要当前值作为目标的50%

db.criteria.find( { $expr: { $eq: [ "$goal.currentValue" , {divide : ["$goal.goal",2]} ] } } )

我不知道Spring,以及Spring如何使用mongodb,这就是为什么我在Mongo Shell中给出了答案。您可以在Spring MongoTemplate中编写语法。这个想法是使用$expr在匹配条件下使用文档字段。

有关更多信息,请阅读MongoDB official $expr documentation

更新

相同的MongoTemplate语法可能看起来像这样(未经测试):

BasicQuery query1 = new BasicQuery("{ $expr: { $eq: [ '$goal.currentValue' , '$goal.goal' ] } }");
List<Document> = mongoOperation.find(query1, Document.class);

尝试一下,并告诉我上述查询中是否有错误。我只是尝试用您所需的语法编写它。

答案 1 :(得分:1)

我试图解决以下查询:“将当前值与目标相同的值带给我”或“将当前值等于其目标50%的文件带给我”。

这可以使用$ where运算符完成,您可以在其中传递JavaScript表达式或指定要评估条件的简单JavaScript函数。

https://docs.mongodb.com/manual/reference/operator/query/where/

这是我运行并给出预期结果的示例查询:

db.getCollection("stackQues").find(
    {
      $or: [
                {$where: "this.goal.currentValue == this.goal.goal"}, 
                {$where: "this.goal.currentValue == this.goal.goal/2"}
            ]
    }
);