基于深度嵌套对象单个字段的morphia查询

时间:2012-01-09 06:39:50

标签: java mongodb playframework morphia

我想基于对象的id(或其他单个字段)检索一个对象,该对象嵌套在我想要检索的对象的2个级别。举例说明:

我想查找特定用户评论过的所有博文。

Blog
  List<Comment>
    ignoredField1
    ignoredField2
    User
      id
      name
      ignoredField3

评论和用户的父对象是@Referenced。

阅读此帖后 http://groups.google.com/group/morphia/browse_thread/thread/57090ef1bd2f3e74?pli=1

我理解如何找到带有注释的博客,其中ignoredField1 / 2具有特定值,但我想要进一步导航。

我尝试过以下操作,但因为比较了所有评论字段,所以没有匹配

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

1 个答案:

答案 0 :(得分:4)

我必须在以下几个步骤中做到这一点:

  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. 获取包含这些评论的所有博客..

  4. 然而,有更好的方法:

    1. 嵌入评论而不是引用它们。它们作为一个独立的对象没有多大意义。然后你可以这样做:

      Query q = ds.createQuery(Blog.class);
      q.field("comments.user").equal("name");
      
    2. 将评论中的引用添加回Blog - 例如名为“blog”的ObjectId字段。然后你可以这样做:

      Query q = ds.createQuery(Comment.class);
      q.field("user").equal("name");
      q.retrievedFields(true, "blog"); // only get the blog ObjectIds
      
    3. 获取所有Blog对象ID,然后再继续加载它们。