【问题标题】:morphia query based on single field of deeply nested object基于深度嵌套对象单字段的morphia查询
【发布时间】:2012-02-05 18:29:32
【问题描述】:

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

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

Blog
  List<Comment>
    ignoredField1
    ignoredField2
    User
      id
      name
      ignoredField3

评论和用户被他们的父对象@Referenced。

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

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

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

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

【问题讨论】:

    标签: java mongodb playframework morphia


    【解决方案1】:

    我认为您必须分几步完成:

    1. 获取用户的对象 ID

      ObjectId id = userObj.getId();
      
    2. 获取该用户的所有 cmets

      Query q = ds.createQuery(Comment.class);
      q.field("user").equal("name");
      q.retrievedFields(true, "_id"); // just get the IDs
      
    3. 使用这些 cmets 获取所有博客..

    不过,还有更好的方法:

    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,然后在进一步的步骤中加载它们。

    【讨论】:

    • 你回答的第一部分在这个场合帮助了我,谢谢。至于第二个有效点 - 我完全同意,但是我的真实模型不同之处在于它需要 3 级 @Referenced 对象,但您的建议已说服我考虑在未来更改模型。
    猜你喜欢
    • 2023-03-25
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2020-02-14
    相关资源
    最近更新 更多