如何将指定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
相关产品推荐
相关产品推荐

