如何使用Spring MongoTemplate构建指定MongoDB聚合查询?
我来帮你把这条MongoDB聚合查询转换成Spring中使用MongoTemplate和Aggregation实现的代码,咱们一步步拆解来做:
使用Spring MongoTemplate构建目标聚合查询
首先,我们对应原MongoDB查询的三个阶段,逐个转换成Spring Data MongoDB的Aggregation操作:
1. 构建Group分组阶段
原查询的$group是按createdAt的日、月、年分组,统计每组数量并保留组内第一条createdAt作为日期字段。在Spring中用GroupOperation实现:
GroupOperation groupOperation = Aggregation.group( DateOperators.DayOfMonth.dayOfMonth("createdAt").as("day"), DateOperators.Month.month("createdAt").as("month"), DateOperators.Year.year("createdAt").as("year") ).count().as("count") // 统计数量对应原$sum:1 .first("createdAt").as("date"); // 取第一条createdAt对应原$first
2. 构建Project字段投影阶段
原查询的$project是把date转换成%Y-%m-%d格式,保留count并移除默认的_id字段。这里用ProjectionOperation实现:
ProjectionOperation projectionOperation = Aggregation.project("count") .and(DateOperators.DateToString.dateOf("date") .toString("%Y-%m-%d")) .as("date") // 转换日期格式 .andExclude("_id"); // 排除_id字段
3. 构建Match过滤阶段
最后$match过滤出date大于等于指定日期的结果,用MatchOperation实现:
MatchOperation matchOperation = Aggregation.match( Criteria.where("date").gte("2020-06-05") );
4. 组装聚合操作并执行
把上面三个阶段组装起来,通过MongoTemplate执行查询:
// 组装完整聚合流程 Aggregation aggregation = Aggregation.newAggregation( groupOperation, projectionOperation, matchOperation ); // 执行查询,这里假设你的业务实体类是BillingDomain,结果用DTO接收 AggregationResults<BillingStatsDto> results = mongoTemplate.aggregate( aggregation, "billingDomain", // 对应MongoDB集合名 BillingStatsDto.class // 接收聚合结果的DTO类 ); // 获取最终结果列表 List<BillingStatsDto> statsList = results.getMappedResults();
补充说明
- 你需要创建一个
BillingStatsDto类来映射聚合结果,结构示例:
public class BillingStatsDto { private String date; private long count; // 构造函数、getter、setter方法 }
- 确保导入正确的Spring Data MongoDB依赖包,核心导入示例:
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.aggregation.DateOperators; import org.springframework.data.mongodb.core.query.Criteria;
这样写出来的代码就完全对应你原来的MongoDB原生聚合查询,每个阶段都一一对应,应该能解决你构建查询的困难。
内容的提问来源于stack exchange,提问作者Parminder Singh




