web-dev-qa-db-ja.com

Spring MongoRepositoryは、挿入ではなく更新またはアップロードしています

私は使用しています:

org.springframework.data.mongodb.repository.MongoRepository

空のDBから始めて、たとえば_id = 1234でオブジェクトを作成し、他のStringフィールドをhelloに設定してから、次のようにします。

repository.save(object);

すべてが順調で、ドキュメントをMondoDBに保存します。

新しいオブジェクトを作成し、同じ_id = 1234を設定しますが、他のStringフィールドをworldに設定してから、別の保存に設定します。

repository.save(newObject);

結果:保存は機能しますが、元のオブジェクトは更新されます。

期待される結果:_idは一意であり、各保存を行うときに2つの個別のオブジェクトを使用しているため、DuplicateKeyExceptionで失敗します。

春の欠陥か、何か間違ったことをしていますか?

20
Marc

Saveは、定義により、アップサートスタイルでオブジェクトを更新し、存在する場合は更新し、存在しない場合は挿入することになっています。 MongoDbのsave操作ドキュメントを読む website

Mongodbのinsert操作には期待どおりの動作がありますが、MongoRepositoryのドキュメントからは、挿入は保存するように委任されているため、違いはありません。しかし、あなたはそれを試して、それがあなたのために働くかどうか見ることができます。それ以外の場合は、オブジェクトが存在するかどうかを確認する前にgetを実行するだけです。これは、インデックスルックアップであるため高速です。

Edit:リポジトリのバージョンを確認します。insertversion 1.7 で導入されました。

30
tinker

長い困難がこれを見つけた後、フィールドの1つに@Id注釈がある場合にのみ、アプリケーションが更新されます。

@Document(collection="bus")
public class Bus {

//  @Indexed(unique=true, direction=IndexDirection.DESCENDING, dropDups=true)
    @Id
    private String busTitle; 
    private int totalNoOfSeats;
    private int noOfSeatsAvailable; 
    private String busType; 
}

しかし、どういうわけか私は@Indexed(unique = true、direction = IndexDirection.DESCENDING、dropDups = true)を使用できませんでした

4
Naveen