5

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

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

Blog
  List<Comment>
    ignoredField1
    ignoredField2
    User
      id
      name
      ignoredField3

评论和用户由其父对象@Referenced。

阅读这篇文章后 http://groups.google.com/group/morphia/browse_thread/thread/57090ef1bd2f3e74?pli=1

我了解如何找到带有 ignoreField1/2 具有特定价值的评论的博客,但我想进一步导航。

我尝试了以下方法,但是因为比较了所有评论字段,所以没有匹配

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

1 回答 1

5

我认为你必须通过几个步骤来完成它:

  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. 将 Comments 中的引用添加回 Blog - 例如名为“blog”的 ObjectId 字段。然后你可以这样做:

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

获取所有博客对象 ID,然后在进一步的步骤中加载它们。

于 2012-01-09T17:04:41.323 回答