SQL等效于MongoDB连接和摘要

时间:2013-07-02 07:45:18

标签: mongodb mapreduce

我有一个数据子集

具有登录日期等的用户然后是位置集合。

我希望获得在特定日期范围内登录的所有用户,然后查看每个郊区有多少用户

现在,在SQL中我会加入表,进行一些分组和计数。

但是在mongo中,我不确定最好的方法是使用聚合函数还是map reduce功能。

{
  "_id" : ObjectId("50174af210bb50b471000036"),
  "state_code" : "ACT",
  "suburb" : "Barton",
  "postcode" : 221,
  "loc" : [149.129623, -35.302345]
}

个人资料看起来像这样

{
  "_id" : ObjectId("50176d9b539ba2903e000001"),
  "created_at" : ISODate("2012-07-31T05:31:07.538Z"),
  "gender" : "female",
  "first_name" : "Marge",
  "last_name" : "Simpson",
  "location_id" : ObjectId("50174af210bb50b471000235"),
  "s_location_name" : "Surry Hills (NSW)",
  "updated_at" : ISODate("2012-10-18T23:29:54.979Z"),
  "user_id" : ObjectId("50176c2510bb50a618000002")
}

并且用户有最后一次登录

{   "_id" : ObjectId("50176c2510bb50a618000002"),
    "created_at" : ISODate("2012-07-31T03:09:47.363Z"),
    "last_sign_in_at" : ISODate("2012-10-08T04:56:53.751Z"),
   "updated_at" : ISODate("2012-10-30T03:52:33.976Z")
}

我想要的是

墨尔本X用户在日期范围内注册

所以SQL伪代码将是

select suburb, count(*) 
from user 
where last_login between x and y 
group by suburb

1 个答案:

答案 0 :(得分:2)

您在设计数据的数据模型时遇到了经典错误(就像您对关系数据库所做的那样),而不是日期用法。就像MongoDB中的任何其他操作一样,聚合框架或Map / Reduce都不能在多个集合上完成。

在这种情况下,我可能会合并配置文件和用户集合,但它们似乎并不太有用,无论如何都没有。其次,如果位置集合中的郊区是唯一的,就像它的_id一样,那么你应该将_id设为郊区的值而不是一些虚构的对象ID。如果它是唯一的郊区+ state_code,请将其作为_id字段。在MongoDB中,_id字段可以是任何类型。如果_id是值,那么您的users / profiles集合可以使用location_id(重命名为location_suburb f.e.)的值(希望只是郊区名称),然后您可以使用可以分组的架构设计:

db.users.aggregate( { $group: { _id: location_suburb, count: { $sum: 1 } } } );

提醒一下:即使您的MongoDB没有架构,也并不意味着您不需要设计架构。