1

我有一个数据子集

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

我想获取在某个日期范围内登录的所有用户,然后查看每个郊区有多少人这样做

现在,在 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
4

1 回答 1

2

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

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

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

提醒一下:即使您的 MongoDB 是无模式的,但这并不意味着您不需要设计模式。

于 2013-07-02T11:26:21.003 回答