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

Tob*_*oby 6 java mongodb playframework morphia

我想根据一个对象的ID(或其他单个字段)来检索一个对象,该对象从要检索的对象中嵌套2个级别。一个例子来说明:

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

Blog
  List<Comment>
    ignoredField1
    ignoredField2
    User
      id
      name
      ignoredField3
Run Code Online (Sandbox Code Playgroud)

注释和用户由其父对象引用。

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

我了解如何找到带有注释的博客,其中ignoreField1 / 2具有特定的价值,但我想进一步浏览。

我尝试了以下操作,但是由于比较了所有注释字段,所以没有匹配项

q.field("comments").hasThisElement(new Comment(new User("name")));
Run Code Online (Sandbox Code Playgroud)

Nic*_*ell 5

我认为您必须按照几个步骤进行操作:

  1. 获取用户的对象ID

    ObjectId id = userObj.getId();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 获取与该用户的所有评论

    Query q = ds.createQuery(Comment.class);
    q.field("user").equal("name");
    q.retrievedFields(true, "_id"); // just get the IDs
    
    Run Code Online (Sandbox Code Playgroud)
  3. 获取所有带有这些评论的博客。

但是,有更好的方法:

  1. 嵌入评论而不是引用它们。它们作为独立对象没有多大意义。然后,您可以执行以下操作:

    Query q = ds.createQuery(Blog.class);
    q.field("comments.user").equal("name");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从注释添加回引用到Blog的引用-例如,一个名为“ blog”的ObjectId字段。然后,您可以执行以下操作:

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

获取所有Blog对象ID,然后在下一步中加载它们。