我是pymongo / mongodb的新手,现在我遇到了挑战。
我在mongodb(v 2.04)中存储了以下结构。
{
"t": <timestamp>,
"d": {
"uid": <string>,
"action": <string>
}
}
此结构跟踪用户操作,并且复杂性略微降低。 数据非常庞大,查询将有一个限制日期,以减少结果。
我希望能够创建一个在特定时间段内执行操作最多的用户的表格。
表:
Rank Uid #num actions
1 5 235
2 237 234
3 574 229
到目前为止,我只查询了点点滴滴:
query = {"t": {"$lte": end_utc, "$gte": start_utc}}
db.actions.find(query).distinct("d.uid")
这将只生成一个唯一的uid列表。 如何查询(使用pymongo)获取如下列表:
[
{
"actions": 100,
"uid": 273
},
{
"actions": 99",
"uid": 632
}..n sorted on actions descending
]
答案 0 :(得分:5)
如果您使用的是MongoDB 2.1+,则可以使用aggregation framework进行此类查询:
db.actions.aggregate([
# Filter the docs to just those within the specified timerange
{"$match": {"t": {"$lte": end_utc, "$gte": start_utc}}},
# Group the docs on d.uid, assembling a count of action docs with each value
{"$group": {"_id": "$d.uid", "actions": {"$sum": 1}}},
# Sort by actions, descending
{"$sort": { "actions": -1 }}
])