2

私は現在、SpringDataを介してMongoDbのドキュメントを更新する方法を理解しようとしています。もちろん、mongoTemplate.updateFirstなどがあります。しかし、これを考慮してください:

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);

...ユーザーにクエリを実行します。nullの場合は例外をスローします。見つかった場合はlogincountを1増やします。完全に機能します。しかし、これは正しい方法ですか?ユーザーを再度照会する必要がありますか?オブジェクトを変更して再保存することはできませんか?

4

3 に答える 3

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");
}
于 2012-05-11T14:24:34.943 に答える
1

テンプレートを使用してエンティティの出入りを行う場合は、次のようにします。

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

実際にクエリを作成する必要がないため、リポジトリを確認することもできます。

于 2012-05-09T23:48:30.210 に答える
1

おそらく upsert セマンティクスを使用する必要があります。

この投稿の回答を参照してください: MongoDB and upsert issue

于 2012-05-09T22:45:41.013 に答える