You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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

火山引擎 最新活动