如何在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
相关产品推荐
相关产品推荐

