在SpringBoot中获取MongoDB数组字段的唯一值
在SpringBoot中实现MongoDB数组字段去重
需求说明
对MongoDB集合内values字段(数组类型)做去重处理,保留每个数组的唯一元素,最终返回包含name和去重后数组的文档。
原集合数据
{ "_id" : ObjectId("5d4b3d44101cc8e202d30eaf"), "name" : "motorManufacturer", "values" : [ "LEAM", "Bico", "Bico", "LEAM" ] } { "_id" : ObjectId("5d4b3d44101cc8e202d30eaf"), "name" : "motorManufacturer", "values" : [ "NOV", "NOV", "SLB", "SLB", "SD" ] }
期望结果
{ "name" : "motorManufacturer", "values" : [ "Bico", "LEAM" ] } { "name" : "motorManufacturer", "values" : [ "NOV", "SLB", "SD" ] }
实现方案
推荐使用MongoDB原生聚合操作实现,效率远高于Java代码手动去重。以下是两种SpringBoot中的实现方式:
方式1:使用MongoTemplate
- 定义实体类
import org.springframework.data.mongodb.core.mapping.Document; import lombok.Data; import java.util.List; @Document(collection = "your_collection_name") @Data public class Manufacturer { private String id; private String name; private List<String> values; }
- 编写业务逻辑
import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.aggregation.Aggregation; import org.springframework.data.mongodb.core.aggregation.AddFieldsOperation; import org.springframework.data.mongodb.core.aggregation.ProjectionOperation; import org.springframework.stereotype.Service; import java.util.List; @Service public class ManufacturerService { private final MongoTemplate mongoTemplate; public ManufacturerService(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } public List<Manufacturer> getDistinctValues() { // 替换values字段为去重后的数组(利用$setUnion自动去重) AddFieldsOperation addFields = AddFieldsOperation.addField("values") .withValue(Aggregation.setUnionOf("values").and("[]")); // 排除_id字段,保留name和去重后的values ProjectionOperation project = Aggregation.project("name", "values") .andExclude("_id"); // 组装并执行聚合查询 Aggregation aggregation = Aggregation.newAggregation(addFields, project); return mongoTemplate.aggregate(aggregation, "your_collection_name", Manufacturer.class).getMappedResults(); } }
方式2:使用MongoRepository(注解式聚合)
- 定义Repository接口
import org.springframework.data.mongodb.repository.Aggregation; import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface ManufacturerRepository extends MongoRepository<Manufacturer, String> { @Aggregation(pipeline = { "{ $addFields: { values: { $setUnion: ['$values', []] } } }", "{ $project: { _id: 0, name: 1, values: 1 } }" }) List<Manufacturer> findDistinctValues(); }
- 调用方法
在业务类中注入ManufacturerRepository,直接调用findDistinctValues()即可获取结果。
关键说明
$setUnion是MongoDB 3.2+支持的操作符,通过将目标数组与空数组取并集,自动实现数组元素去重,逻辑简洁且性能优异。- 如果需要将去重后的数组命名为
group,只需修改聚合操作中的字段名,同时对应调整实体类字段即可。
内容的提问来源于stack exchange,提问作者Abhinath Jadhav
相关产品推荐
相关产品推荐

