2017-07-19 44 views
1

我想在MongoDB中爲文檔上的每個更新更新update_at屬性,以便稍後可以根據上次update_at字段檢索文檔。我遇到這種情況有兩種方法。使用Morphia Java在每個udpate上更新mongo中的updated_at屬性

  1. 更新update_at在每個DAO調用,比如

    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. 其他方法是調用蒙戈的生命週期法模型(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()時更新日期。

回答

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接口的一部分。

相關問題