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

如何在MongoRepository中编写MongoDB自定义查询无需聚合管道获取去重数据

去重需求实现说明

核心疑问确认

无需手动编写聚合管道即可实现多字段联合去重需求,MongoDB 提供了封装好的去重查询 API 直接满足该场景。

实现方案(Java 版)

以下两种方案均可实现样例数据按empName+emp_city联合去重的需求,返回结果和预期输出完全匹配。

方案1:使用Spring Data MongoDB MongoTemplate实现

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
import java.util.Map;

// 去重查询逻辑
public List<Map> getDistinctEmpData(MongoTemplate mongoTemplate) {
    Query query = new Query();
    // 指定按empName和emp_city两个字段联合去重,返回去重后的字段组合
    return mongoTemplate.findDistinct(query, new String[]{"empName", "emp_city"}, "替换为你的实际集合名", Map.class);
}

如果需要映射为自定义实体类,把返回值的Map.class替换为你的实体类Class即可。

方案2:使用原生Java MongoDB Driver实现

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import java.util.ArrayList;
import java.util.List;

public List<Document> getDistinctEmpData(MongoDatabase database) {
    MongoCollection<Document> collection = database.getCollection("替换为你的实际集合名");
    List<Document> result = new ArrayList<>();
    // 多字段联合去重查询
    collection.distinct("empName", String.class).forEach(empName -> {
        collection.distinct("emp_city", new Document("empName", empName), String.class).forEach(city -> {
            result.add(new Document("empName", empName).append("emp_city", city));
        });
    });
    return result;
}

补充说明

如果你的去重逻辑只涉及单个字段,直接调用distinct方法传入单个字段名即可,性能比多字段去重更高。

内容的提问来源于stack exchange,提问作者prabhakar srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 16:48:03