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

在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

  1. 定义实体类
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;
}
  1. 编写业务逻辑
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(注解式聚合)

  1. 定义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();
}
  1. 调用方法
    在业务类中注入ManufacturerRepository,直接调用findDistinctValues()即可获取结果。

关键说明

  • $setUnion是MongoDB 3.2+支持的操作符,通过将目标数组与空数组取并集,自动实现数组元素去重,逻辑简洁且性能优异。
  • 如果需要将去重后的数组命名为group,只需修改聚合操作中的字段名,同时对应调整实体类字段即可。

内容的提问来源于stack exchange,提问作者Abhinath Jadhav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 05:36:00