私は使用しています:
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
で失敗します。
春の欠陥か、何か間違ったことをしていますか?
Saveは、定義により、アップサートスタイルでオブジェクトを更新し、存在する場合は更新し、存在しない場合は挿入することになっています。 MongoDbのsave
操作ドキュメントを読む website
Mongodbのinsert操作には期待どおりの動作がありますが、MongoRepositoryのドキュメントからは、挿入は保存するように委任されているため、違いはありません。しかし、あなたはそれを試して、それがあなたのために働くかどうか見ることができます。それ以外の場合は、オブジェクトが存在するかどうかを確認する前にgetを実行するだけです。これは、インデックスルックアップであるため高速です。
Edit:リポジトリのバージョンを確認します。insertは version 1.7 で導入されました。
長い困難がこれを見つけた後、フィールドの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)を使用できませんでした