2

私は 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

]
4

1 に答える 1

5

MongoDB 2.1+ を使用している場合は、このタイプのクエリに集計フレームワークを使用できます。

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 }}
])
于 2012-11-20T18:02:41.480 に答える