我有一个数据子集
具有登录日期等的用户然后是位置集合。
我希望获得在特定日期范围内登录的所有用户,然后查看每个郊区有多少用户
现在,在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
答案 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没有架构,也并不意味着您不需要设计架构。