2016-10-10 7 views
0

私はモデルを持っている:modelRepository.save()を呼び出すと、spring-data-mongodbは正確に何をしますか?例えば

@Document(collection = "events") 
public class Event { 
    @Id 
    private String id; 
    private String value1; 
    private Spring value2; 
} 

とサービスクラスのいくつかのコード:

Event event = eventRepository.findOne("1"); 
event.setValue1("newValue1"); 
eventRepository.save(event); 

ん春データは、文書または変更されたフィールドのみのためにすべてのフィールドを更新しますか? この場合、field2については、古い値で更新されますか?

ログを有効にして、春のデータの正確性を確認するにはどうすればよいですか?

logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG 

だけでなく、更新のためのクエリのログのこの1つのターンは:

016-10-10 09:39:25.938 DEBUG 11417 --- [ restartedMain] o.s.data.mongodb.core.MongoTemplate  : findOne using query: { "_id" : "1"} in db.collection: t87.events 
2016-10-10 09:39:25.965 DEBUG 11417 --- [ restartedMain] o.s.data.mongodb.core.MongoTemplate  : Saving DBObject containing fields: [_class, _id, value1, value2] 

答えて

2

MongoRepository.save()は、舞台裏でのMongoDB db.collection.saveを呼び出します。 idの値に応じて、文書全体にを挿入またはアップ/置き換えることができます。

だから、あなたの質問への答えに:

ん春データは、文書または変更されたフィールドのみのためにすべてのフィールドを更新しますか?この場合、field2については何ですか、それは古い値で更新されますか?

すべてのフィールドは、古い値を持つフィールド-2を含む(アップサート)が更新されます。

より効率的なフィールド1のみを設定するには、Update$setの演算子と組み合わせてMongoTemplateを使用する必要があります。

何が起きているのかを見るには、MongoDBログを見て、更新操作の処理方法を確認することをお勧めします。各書き込み操作をキャプチャする方法については、setProfilingLevelを参照してください。プロファイリング・レベルを2に設定して各操作を記録する必要があります。後でそれをオフにすることを忘れないでください。

関連する問題