0

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

此刻,我将 UserInfo 类的对象引用到 User 类中,如下面所述的结构及其在数据库中的存储, {"firstName","John"},{"lastName","Nash"},{userInfo: userInfoID}但如果我创建一个嵌入式关系,那么它将存储所有 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中的年龄字段和User的所有字段,所以哪个 Annotation 最好,@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 查询,这会通过引用两个表来消耗更多时间。

4

2 回答 2

1

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

MongoDB和“加入”

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

了解当涉及 3 个或更多表时 JOIN 的工作原理。[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 来说太糟糕了。

于 2013-08-02T08:08:50.340 回答
0

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

于 2013-08-01T17:41:33.113 回答