春数据的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)它的工作原理。为什么会这样?是一个错误?我希望部门实体按名称唯一编制索引,两个公司在共享相同部门时不应存在任何问题。

+1

这是索引的工作原理。它们在收集文件中是独一无二的,而不是单个文件。看[解释](https://docs.mongodb.com/manual/core/index-unique/#unique-constraint-across-separate-documents)和[解决方法](https://jira.mongodb.org/browse/SERVER-1068) – Veeram

+0

@Veeram哦,好吧,那很糟糕。 ty – anat0lius

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

但是,如果您试图在部门和公司之间建立关系,您应该添加@DBRef以获得private List<Sector> sectors = new ArrayList<>();

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

+0

我不想使用@DBRef,因为我想在查询时能够访问Sector属性。 – anat0lius