Spring Data MongoDb - 使用@Indexed嵌入文档(unique = true)

时间:2017-06-21 09:39:17

标签: mongodb spring-data

我定义了以下集合:

@Document(collection="sectors")
public class Sector {

    private final String id = null;
    @Indexed(unique=true)  
    private String name;


}


@Document(collection="companies")
public class Company {

    @Id
    private UUID uid; 
    @Indexed(unique=true)
    private String nif;
    private String name;
    private List<Sector> sectors = new ArrayList<>();
}

如果我尝试插入两个具有相同行业的公司,那么我就得到了 'E11000 duplicate key error index: fake.companies.sectors.name dup key : {[[sector1, sector2]] }';

从扇区评论@Indexed(unique=true)它有效。为什么会这样?是个bug吗?我希望Sector实体按名称进行唯一索引,两家公司在共享相同的Sectors时应该没有任何问题。

1 个答案:

答案 0 :(得分:0)

您当前正在创建扇区,不是作为单独的文档而是作为嵌套对象。这意味着spring数据忽略@Document注释并使用@Indexed注释。每个公司都不一定要有一个独特的部门。

然而。如果您尝试在行业和公司之间创建关系,则应为@DBRef添加private List<Sector> sectors = new ArrayList<>();

这样Spring数据将引用该扇区。请注意,mongoDB不会为您级联,您必须先创建扇区才能将其作为DBRef引用。另一种方法是只保存扇区ID并在需要时手动抓取它。