2017-06-21 2 views
0

で文書を埋め込む:春データのMongoDB - 私は、次のコレクションを定義している@Indexed(真=ユニーク)

@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)をコメントアウトしています。なぜこれが起こるのですか?バグですか?私はセクターエンティティを名前で一意に索引付けし、2つの企業は同じセクターを共有することに問題がないようにしたい。

+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

答えて

0

現在、セクタは別個のドキュメントではなく、ネストされたオブジェクトとして作成しています。つまり、スプリングデータは@Document注釈を無視し、@Indexed注釈を使用します。セクターはすべての会社にとってユニークでなければなりません。

ただし、セクターと企業の間の関係を作成する場合は、private List<Sector> sectors = new ArrayList<>();の場合は@DBRefを追加してください。

このようにして、Springデータはセクターを参照します。 mongoDBはカスケードしないので、DBRefとして参照できるようにするにはセクタを作成する必要があります。別の方法として、セクタIDを保存し、必要に応じて手動で取得する方法があります。

+0

@DBRefを使用したくないのは、私が照会しているときにSectorプロパティにアクセスできるようにしたいからです。 – anat0lius

関連する問題