我定义了以下集合:
@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时应该没有任何问题。
答案 0 :(得分:0)
您当前正在创建扇区,不是作为单独的文档而是作为嵌套对象。这意味着spring数据忽略@Document
注释并使用@Indexed
注释。每个公司都不一定要有一个独特的部门。
然而。如果您尝试在行业和公司之间创建关系,则应为@DBRef
添加private List<Sector> sectors = new ArrayList<>();
这样Spring数据将引用该扇区。请注意,mongoDB不会为您级联,您必须先创建扇区才能将其作为DBRef引用。另一种方法是只保存扇区ID并在需要时手动抓取它。