使用Morphia Java

时间:2017-07-19 08:42:04

标签: java mongodb playframework morphia database

我希望在文档的每次更新中更新MongoDB中的update_at属性,以便稍后我可以根据上一次update_at字段检索文档。我在这种情况下遇到了两种方式。

  1. 在每个DAO调用中更新update_at,如

    public void updateMemberDetails(Long memberId, Sring email) {
    UpdateOperations<Member> ops =   getDs().createUpdateOperations(Member.class);
    Query<Member> query = basicQuery(memberId);
    ops.set("email", email);
    ops.set("update_at", new Date());
    getDs().update(query, ops);
    }
    
  2. 其他方法是在模型中调用Mongo的生命周期方法(http://mongodb.github.io/morphia/1.4/guides/lifeCycleMethods/

    @PrePersist public void prePersist() { update_at = new Date(); }

  3. 问题: - 方法1工作得很好,但方法1的唯一缺点是我必须在每个DAO更新方法中添加ops.set("update_at", new Date());,我不想在每个方法中更新。

    在仅在prePersist()中调用的方法2 operation db.save()方法中,不在db.update()操作中调用prePersist()方法。因此,当DAO方法调用db.update()时,我无法更新日期。

1 个答案:

答案 0 :(得分:1)

这比使用update()的性能低,因为它会加载对象以进行保存,但是如何:

public void updateMemberDetails(Long memberId, Sring email) {
  Datastore ds = getDs();
  UpdateOperations<Member> ops = ds.createUpdateOperations(Member.class);
  QueryImpl<Member> query = basicQuery(memberId);
  Member member = query.get();
  member.setEmail(email);
  ds.save(member);
}

它还为您提供了将验证逻辑添加到setEmail()函数中的选项。

注意:get()方法位于QueryImpl,位于QueryResults界面,不属于Query界面。