春数据的MongoDB - 嵌入与@Indexed文档(唯一= TRUE)
问题描述:
我已经定义以下集合:春数据的MongoDB - 嵌入与@Indexed文档(唯一= TRUE)
@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)
它的工作原理。为什么会这样?是一个错误?我希望部门实体按名称唯一编制索引,两个公司在共享相同部门时不应存在任何问题。
答
您目前正在创建扇区而不是作为一个单独的文档,而是作为嵌套的对象。这意味着弹簧数据将忽略@Document
注释并使用注释@Indexed
。没有一个部门对每个公司都是独一无二的。
但是,如果您试图在部门和公司之间建立关系,您应该添加@DBRef
以获得private List<Sector> sectors = new ArrayList<>();
这样Spring数据将引用扇区。请注意,mongoDB不会为您级联,您必须创建该扇区才能将其作为DBRef参考。另一种方法是保存扇区ID并在需要时手动抓取。
+0
我不想使用@DBRef,因为我想在查询时能够访问Sector属性。 – anat0lius
这是索引的工作原理。它们在收集文件中是独一无二的,而不是单个文件。看[解释](https://docs.mongodb.com/manual/core/index-unique/#unique-constraint-across-separate-documents)和[解决方法](https://jira.mongodb.org/browse/SERVER-1068) – Veeram
@Veeram哦,好吧,那很糟糕。 ty – anat0lius