从PyMongo查询中排序结果

Pro*_*mer 3 python mongodb pymongo mongodb-query aggregation-framework

我有一个MongoDB查询如下:

data =  db.collection.aggregate([{"$match":{"created_at":{"$gte":start,"$lt":end}}},{"$group":{"_id":"$stage","count":{"$sum":1}}},{"$match":{"count":{"$gt":m{u'count': 296, u'_id': u'10.57.72.93'}
Run Code Online (Sandbox Code Playgroud)

这导致以下输出:

{u'count': 230, u'_id': u'111.11.111.111'}
{u'count': 2240, u'_id': u'111.11.11.11'}
Run Code Online (Sandbox Code Playgroud)

我试图通过'count'列对输出进行排序:

data.sort('count',  pymongo.DESCENDING)
Run Code Online (Sandbox Code Playgroud)

...但我收到以下错误:

'CommandCursor' object has no attribute 'sort'
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个错误的原因吗?

fal*_*tru 6

使用聚合示例中$sort所示:

from bson.son import SON

data =  db.collection.aggregate([
    {"$match":{"created_at":{"$gte":start,"$lt":end}}},
    {"$group":{"_id":"$stage","count":{"$sum":1}}},
    {"$match":{"count": ... }},
    {"$sort": SON([("count", -1)])}  # <---
]) 
Run Code Online (Sandbox Code Playgroud)

替代通用解决方案:使用sorted自定义键功能:

data =  db.collection.aggregate(...)
data = sorted(data, key=lambda x: x['count'], reverse=True)
Run Code Online (Sandbox Code Playgroud)