pymongo / mongodb高级查询

时间:2012-11-20 16:39:21

标签: mongodb pymongo

我是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

]

1 个答案:

答案 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 }}
])