如何在Spring Boot中使用Criteria编写MongoDB聚合查询
Spring Boot中MongoDB聚合查询的Criteria实现
以下是对应你提供的MongoDB原生聚合查询的Spring Data MongoDB实现代码,使用Aggregation API构建:
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.GroupOperation; import org.springframework.data.mongodb.core.aggregation.MatchOperation; import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; import org.springframework.data.mongodb.core.query.Criteria; // 注入MongoTemplate @Autowired private MongoTemplate mongoTemplate; public void executeAggregation() { // 1. $group 阶段:按field1分组,统计每组数量 GroupOperation groupOperation = Aggregation.group("field1") .count().as("count"); // 2. $match 阶段:过滤分组id不为空且count大于1的结果 MatchOperation matchOperation = Aggregation.match( Criteria.where("_id").ne(null) .and("count").gt(1) ); // 3. $project 阶段:重命名_id为name,隐藏原_id字段 ProjectionOperation projectionOperation = Aggregation.project() .and("_id").as("name") .andExclude("_id"); // 构建聚合管道 Aggregation aggregation = Aggregation.newAggregation( groupOperation, matchOperation, projectionOperation ); // 执行聚合查询,结果映射到自定义DTO List<NameCountDTO> results = mongoTemplate.aggregate( aggregation, "collection", // 替换为你的集合名称 NameCountDTO.class ).getMappedResults(); } // 用于接收查询结果的DTO类 class NameCountDTO { private String name; // getter和setter public String getName() { return name; } public void setName(String name) { this.name = name; } }
关键阶段说明
- $group 阶段:通过
Aggregation.group("field1")指定分组字段,count().as("count")实现$sum:1的统计逻辑,将统计结果命名为count。 - $match 阶段:用
Criteria构建过滤条件,ne(null)对应原生查询的$ne: null,gt(1)对应$gt:1,再通过Aggregation.match()封装为匹配操作。 - $project 阶段:
and("_id").as("name")实现_id到name的重命名,andExclude("_id")隐藏原_id字段,对应原生查询的{"name" : "$_id", "_id" : 0}。
内容的提问来源于stack exchange,提问作者Janeth Jackson
相关产品推荐
相关产品推荐

