可以在JavaSpring中进行条件聚合吗?

可以在JavaSpring中进行条件聚合吗?,java,spring,mongodb,hibernate,Java,Spring,Mongodb,Hibernate,我在MongoTemplate中使用Spring和MongoDB 我有以下文件: { price: 50.0, goal: { currentValue: 20, goal: 100 } } 我需要执行一个查询,例如“将当前值与目标值相同的值带给我”或“将当前值为目标值50%的文档带给我” 有可能这样做吗?到目前为止,我一直在做这种查询,但从来没有做过条件查询,它使用文档当前值作为条件的一部分 Criteria criteria = Criteria.w

我在MongoTemplate中使用Spring和MongoDB

我有以下文件:

{
  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);
Criteria=Criteria.where(“价格”)。存在(true);
GroupOperation totalAggregation=组()
.sum(“目标.当前值”)
.as(“当前值”)
.sum(“目标、目标”)
.作为(“目标”);
退绕操作退绕=退绕(“目标”);
聚合聚合=新建聚合(匹配(标准)、展开、总计聚合);
AggregationResults=mongoTemplate
.聚合(聚合,“目标”,文档.class);
现在我只想带上上面描述的场景。如何做到这一点


谢谢。

因为您可以使用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,也不知道mongodb是如何与Spring一起使用的,这就是我在MongoShell中给出答案的原因。您可以在Spring MongoTemplate中编写语法。其思想是使用
$expr
在匹配条件下使用文档字段

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);
欲了解更多信息,请阅读

更新

相同的MongoTemplate语法可能如下所示(未测试):

basicquery1=newbasicquery({$expr:{$eq:['$goal.currentValue','$goal.goal']}});
List=mongoOperation.find(query1,Document.class);

试一试,告诉我上面的查询是否有错误。我只是试着用你需要的语法来写它。

我试着解决这个问题:“给我当前值与目标相同的值”或“给我当前值为目标50%的文档”

这可以使用$where操作符来完成,您可以在其中传递一个JavaScript表达式或一个简单的JavaScript函数,该函数指定要计算的条件

以下是我运行的示例查询,并给出了预期结果:

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

您使用的是哪个mongodb版本?@RaviShankarBharti 4.0.1问题是,我想在不存储目标和当前值的情况下执行此操作。此答案也是正确的,但您会发现$where比$where贵得多$expr@RaviShankarBharti同意,$where不使用任何预定义索引