2012-01-09 57 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