【问题标题】:How to retrieve @Reference fields / which is best @Reference or @Embedded and SubQuery in MorphiaQuery如何在 MorphiaQuery 中检索 @Reference 字段/哪个是最好的 @Reference 或 @Embedded 和 SubQuery
【发布时间】:2013-07-31 19:06:10
【问题描述】:

我有一个带有两个模型类的 mongodb,分别是 UserUserInfo。条件是在 User 类中,我必须检索大约 10 个字段的多个字段,例如 "firstName","lastName" 等,而在 UserInfo 模型类中,我只喜欢检索一个字段说“ 年龄”。

此时我将 UserInfo 类的对象引用到 User 类中,如下面的 Structure 中所述,它在 DB 中的存储为 {"firstName","John"},{"lastName","Nash"},{userInfo: userInfoID} 但如果我创建一个 Embedded 关系然后它将存储所有 userInfo 的字段,我认为检索一个(“年龄”)字段是不希望嵌入所有 userInfo 的字段的,这反过来会使我认为应用程序变慢。

无论是@Reference 还是@Embedded,我应该使用哪种场景,我认为Embedded 会减慢我对DB 的响应,但在网站中,它作为参考注释给出只会减慢查询时间并且需要某种延迟加载 总而言之,我的结构如下:

class User extends Model{
 public String firstName;
 public String lastName;
 public String loginTime;
 public String logoutTime;
 public String emailId; etc,etc......
  Some more 10 fields like this+userInfo reference object 
  @Reference
  public UserInfo userInfo;
  }   
  class UserInfo extends Model{
 public String emailId;
 public String age;
 public String sex;
 public String address;
 public String bank; etc,etc......
 Some more 10 fields like this
  }   

如上所述,我只需要 UserInfo 中的 age 字段和 Userall 字段,因此最好使用注释和@Reference 或@Embedded。如果我得到一个对 User 类的查询,我可以在其中检索 User 的所有字段并且只检索 UserInfo 的“age”字段,这将更有帮助。简而言之,当我使用@Reference 关系时,我需要这样的查询

field("userInfo.age") for userInfo.emailId = (MorphiaQuery q =        User.createMorphiaQuery;           
 q.field("firstName").equal("John");     q.field("lastName").equal("Nash");                                             q.field("loginTime").greaterthan("sometime"))//the complex part where I need age of particular userInfo but I have only the ID of the userInfo since I am using Reference and that Id too got from a **subQuery**.... 

请不要写两个查询我需要一个查询或者一个带有子查询的查询。为了更清楚,我可以用 SQL 语言来说明:

   SELECT age FROM UserInfo where emailId = u.emailId
   (SELECT * FROM User WHERE firstName='John' AND lastName='Nash' AND
       logintime='someTime') AS u;    

我需要这个完全相同的查询,而无需编写两个 morphia 查询,这会通过引用两个表来消耗更多时间。

【问题讨论】:

    标签: java mongodb playframework morphia nosql


    【解决方案1】:

    Mongo 不支持跨表/集合的查询。这样的页面会让你满意:

    MongoDB and "joins"

    和sql一样,join查询也是建立中间结果集,再次查询:

    Understanding how JOIN works when 3 or more tables are involved. [SQL]

    当你构建你的模型时,你不应该考虑太多关于什么是单一查询而是结构建模:

    http://docs.mongodb.org/manual/core/data-modeling/

    对于您的情况,如果您使用的是嵌入式,您可以在一个查询中进行此操作,并使用以下查询指定您需要的字段:

    db.User.find({"some_field":"some_query"},{"firstName":1,....,"userInfo.age":1})
    

    在这里查看预测:

    http://docs.mongodb.org/manual/reference/method/db.collection.find/

    如果您使用参考甚至软链接,例如使用 Morphia Key<> 来延迟加载 UserInfo,则需要两次查询。

    如果不是实时应用,你也可以尝试使用 mongo map-reduce 来合并集合来处理大数据,不过 map-reduce 对 mongo 来说太糟糕了。

    【讨论】:

      【解决方案2】:

      我有理由相信你不能只用一个查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2020-04-29
        相关资源
        最近更新 更多