我有用户活动的数据库,我想计算活跃用户和他们每个月的活动数量,然后按年对结果进行排序,然后按月对结果进行排序!
我有查询:
query = {
"activities": {
"$exists": 1
},
"activities.started": {
"$exists": 1,
"$type": MONGODB_DATE_TYPE,
"$gte": datetime(2011, 6, 1),
"$lte": datetime(2013, 10, 1)
}
}
然后,我制作了这样的管道:
pipeline = [
{'$project': {
'_id': 1,
'activities': 1
}},
{'$unwind': "$activities"},
{'$match': query},
{'$group': {
'_id': {"y": {"$year": "$activities.started"},
"m": {"$month": "$activities.started"}},
'users': {'$addToSet': "$_id"},
'activities_count': {"$sum": 1},
}},
{"$sort": {
"_id.y": 1,
"_id.m": 1,
}}
]
results = col.aggregate(pipeline)
results = results.get("result", [])
但是,这个$sort操作效果不好,它没有按_id.y和_id.m排序,只有_id.m!
我一直在关注mongodb $sort 的这个链接,并且有一个例子表明可以在那里按两个值排序。
所以,我的问题是:我怎样才能先按年订购结果,然后按年按月订购?
编辑
例如,当我把变量和类型函数放在pdb
下面时:result
for res in results : print res["_id"]
我得到了这个结果:
{u'y': 2012, u'm': 1}
{u'y': 2013, u'm': 1}
{u'y': 2012, u'm': 2}
{u'y': 2013, u'm': 2}
{u'y': 2012, u'm': 3}
{u'y': 2013, u'm': 3}
{u'y': 2012, u'm': 4}
{u'y': 2013, u'm': 4}
{u'y': 2012, u'm': 5}
{u'y': 2013, u'm': 5}
{u'y': 2011, u'm': 6}
{u'y': 2012, u'm': 6}
{u'y': 2013, u'm': 6}
{u'y': 2011, u'm': 7}
{u'y': 2012, u'm': 7}
{u'y': 2013, u'm': 7}
{u'y': 2011, u'm': 8}
{u'y': 2012, u'm': 8}
{u'y': 2013, u'm': 8}
{u'y': 2011, u'm': 9}
{u'y': 2012, u'm': 9}
{u'y': 2013, u'm': 9}
{u'y': 2011, u'm': 10}
{u'y': 2012, u'm': 10}
{u'y': 2011, u'm': 11}
{u'y': 2012, u'm': 11}
{u'y': 2011, u'm': 12}
{u'y': 2012, u'm': 12}