【问题标题】:Update updated_at attribute in mongo on each update using Morphia Java使用 Morphia Java 在每次更新时更新 mongo 中的 updated_at 属性
【发布时间】:2017-07-19 08:42:03
【问题描述】:

我想为文档的每次更新更新 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(); }

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

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

【问题讨论】:

    标签: java mongodb playframework morphia database


    【解决方案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() 方法通过QueryResults 接口在QueryImpl 中,而不是Query 接口的一部分。

    【讨论】:

      猜你喜欢
      • 2020-07-04
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2012-12-30
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多