You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指定MongoDB聚合查询转换为Spring Boot Reactive MongoDB代码

Spring Boot Reactive MongoDB 聚合实现代码

以下是对应你提供的MongoDB原生聚合查询的Reactive MongoDB实现:

首先,确保你的实体类(比如ServicesPerformed)定义了对应字段:

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.time.LocalDateTime;

@Document(collection = "services_performed")
public class ServicesPerformed {
    @Id
    private String id;
    private LocalDateTime createdOn;
    private String status;

    // 构造函数、getter、setter省略
}

然后在你的业务类中使用ReactiveMongoTemplate实现聚合查询:

import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.ConditionalOperators;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.aggregation.MatchOperation;
import reactor.core.publisher.Flux;
import java.util.Arrays;

// 注入ReactiveMongoTemplate
private final ReactiveMongoTemplate reactiveMongoTemplate;

public Flux<DailyStatusStats> getDailyStatusStats() {
    // 构建Match阶段,对应原查询的$match
    MatchOperation matchOperation = Aggregation.match(
        Criteria.where("status").in(Arrays.asList("INVOICING", "outbound", "accepted", "PENDING APPROVAL"))
    );

    // 构建Group阶段,对应原查询的$group
    GroupOperation groupOperation = Aggregation.group(
            Aggregation.dateToString("%Y-%m-%d", "$createdOn").as("date")
        )
        .sum(ConditionalOperators.when(Criteria.where("status").is("INVOICING")).then(1).otherwise(0)).as("invoicing")
        .sum(ConditionalOperators.when(Criteria.where("status").is("outbound")).then(1).otherwise(0)).as("outbound")
        .sum(ConditionalOperators.when(Criteria.where("status").is("PENDING APPROVAL")).then(1).otherwise(0)).as("accepted");

    // 组装聚合管道
    Aggregation aggregation = Aggregation.newAggregation(matchOperation, groupOperation);

    // 执行聚合查询,映射到结果DTO
    return reactiveMongoTemplate.aggregate(aggregation, "services_performed", DailyStatusStats.class);
}

同时需要定义一个用于接收聚合结果的DTO类DailyStatusStats:

public class DailyStatusStats {
    private String date;
    private long invoicing;
    private long outbound;
    private long accepted;

    // 构造函数、getter、setter省略
}

代码说明:

  • MatchOperation:对应原生查询的$match,过滤出指定状态的文档
  • GroupOperation:对应原生查询的$group,按格式化后的日期分组,通过ConditionalOperators.when实现$cond的逻辑,统计各状态的数量
  • 最后通过reactiveMongoTemplate.aggregate执行查询,并将结果映射到自定义的DTO类中

内容的提问来源于stack exchange,提问作者shanmukhavarma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:23:09