2016-04-26 7 views
6

私はこのように定義された契約のクラスを持っている:SpringのデータMongoDB:ドキュメントが別のドキュメントに埋め込まれていると、一意のインデックスフィールドを無視する方法はありますか?

@Document 
public class Contract { 

    @Id 
    private String id; 

    @Indexed(unique = true) 
    private String ref; 

    private String status = "pending"; 

    // getter & setter & hashcode & equals & tostring... 
} 

私は時間をかけて契約状態を保存したいので、私は、このようなバージョンのクラスを作成しました:私は複数回を保存しようとすると

@Document 
public class Version { 

    @Id 
    private String id; 

    private Contract contract; 

    private Instant createdAt; 

    // getter & setter & hashcode & equals & tostring... 
} 

を時間の経過とともにバージョンオブジェクト、私は重複するキーの例外があります。私はそれがここで不平を言う契約のrefの重複キーインデックスだと思う。

このようなことをどのように達成できますか?

+0

はあなたの問題を披露小さなコードスニペットを提供してもらえますか?モデルを記述したやり方では、Contactオブジェクトがバージョン1内にネストされているため、バージョン内の連絡先がサブ文書として「バージョン」に格納され、 「連絡先」のコレクションは重要ではありません。 –

+0

私はそれ以上書いていません。一意のインデックスを持つ別のオブジェクトにネストされた2つのオブジェクトを作成し、同じ基本コントラストを持つ2つのオブジェクトを保存しようとすると、重複したエントリ例外が発生します。 –

答えて

0

春の文脈からこれを達成する方法があるかどうかはわかりません。

最良の方法は、コード外のすべてのインデックス定義を削除することです。オフラインスクリプトを使用して適用されます。 mongeezのようなツールを使用してスクリプトを適用できます。アプリケーションの起動時に実行するように設定できるため、場所に関係なく常に実行されるようにすることができます。

アプリケーションが公開されると、制御された方法で新しいインデックスを作成することができます。コードに埋め込まれていると、起動時にのみ実行されるため、この利点はありません。

オフラインスクリプトを使用している場合は、完全に制御しています。

1

単にこのよう@Referenceを追加します。

@Document 
public class Version { 

    @Id 
    private String id; 

    @Reference 
    private Contract contract; 

    private Instant createdAt; 

    // getter & setter & hashcode & equals & tostring... 
} 
+0

これは実際には動作しますが、それについての公式の春データmongodbリファレンスにはそれに関する言葉はありません。 –

関連する問題