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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:01:08