2012-01-09 46 views
4

我想基於從我想要檢索的對象嵌套2個級別的對象的id(或其他單個字段)檢索對象。一個示例來演示:基於深度嵌套對象的單個字段的嗎啡查詢

我想查找所有博客文章已被特定用戶評論。

Blog 
    List<Comment> 
    ignoredField1 
    ignoredField2 
    User 
     id 
     name 
     ignoredField3 

評論和用戶由其父對象@引用。

閱讀這篇文章 http://groups.google.com/group/morphia/browse_thread/thread/57090ef1bd2f3e74?pli=1

我明白我怎麼會找到的評論的博客,其中ignoredField1/2有一個特定的值之後,但我想進一步導航比。

我曾嘗試以下,但因爲所有的註釋字段相比,還存在不匹配

q.field("comments").hasThisElement(new Comment(new User("name"))); 

回答

3

你必須做的步驟的饑荒早期預警系統,我認爲:

  1. 得到了用戶的對象ID

    ObjectId id = userObj.getId(); 
    
  2. 獲取所有的意見與該用戶

    Query q = ds.createQuery(Comment.class); 
    q.field("user").equal("name"); 
    q.retrievedFields(true, "_id"); // just get the IDs 
    
  3. 獲取所有博客與評論..

然而,有更好的方法:

  1. 嵌入評論,而不是引用它們。作爲一個獨立的對象它們沒有多大意義。然後,你可以這樣做:

    Query q = ds.createQuery(Blog.class); 
    q.field("comments.user").equal("name"); 
    
  2. 添加從評論的引用回到博客 - 所謂的「博客」,例如ObjectID字段。然後,你可以這樣做:

    Query q = ds.createQuery(Comment.class); 
    q.field("user").equal("name"); 
    q.retrievedFields(true, "blog"); // only get the blog ObjectIds 
    

讓所有的博客對象ID,然後在另一步驟加載它們。

+0

你的回答的第一部分在這個場合幫助我,謝謝。至於第二個有效點 - 我完全同意,但是我的真實模型不同之處在於它需要3個級別的@Referenced對象,但是您的建議已經說服我在將來改變模型。 – Toby 2012-01-10 00:23:22