2012-05-09 20 views
2

現在、Springデータを使用してMongoDbでドキュメントを更新する方法を理解しようとしています。もちろん、mongoTemplate.updateFirstなどがあります。しかし、これを考慮してください:春データMongodb:ドキュメントの更新

User u = mongoTemplate.findOne(new Query(Criteria.where("_id").is(s)), User.class); 
if (u == null) throw new UsernameNotFoundException("user " + s + " does not exist"); 
Session.setCurrentUser(u); 
mongoTemplate.updateFirst(new Query(Criteria.where("_id").is(s)), new Update().inc("logincount", 1), User.class); 

...クエリを実行すると、例外が発生した場合、例外がスローされます。しかし、これは正しい方法ですか?ユーザーを再度照会する必要がありますか?オブジェクトを変更して再保存できませんか?

+0

同様の問題と解像度がで見つけることができます: http://stackoverflow.com/questions/25733781/mongodb-updatefirst-method-用法/ 25735785#25735785 – Karthik

答えて

1

おそらくupsertセマンティクスを使用するべきです。

User user = template.findOne(query(where("id").is(id)), User.class); 
// manipulate object 
template.save(user); 

あなたはまたたい顔をしているかもしれません:あなたはちょうど次の操作を行い内のエンティティとテンプレートを使用してのうち一種のため、最大であればMongoDB and upsert issue

1

この記事で答えを参照してください。リポジトリでは実際にクエリを作成する必要はありません。

3

あなたのような何かをすることによって、余分なクエリを避けることができます:

WriteResult result = mongoTemplate.updateFirst(new Query(Criteria.where("_id").is(s)), new Update().inc("logincount", 1), User.class); 
if (result.getN() != 1) { 
    throw new UsernameNotFoundException("user " + s + " does not exist"); 
} 
関連する問題