从PyMongo查询中排序结果

时间:2016-04-12 07:17:05

标签: python mongodb mongodb-query pymongo aggregation-framework

我有一个MongoDB查询如下:

Disable cache

这导致以下输出:

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'}

我正在尝试按'计数'对输出进行排序。柱:

{u'count': 230, u'_id': u'111.11.111.111'}
{u'count': 2240, u'_id': u'111.11.11.11'}

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

data.sort('count',  pymongo.DESCENDING)

有人可以解释这个错误的原因吗?

3 个答案:

答案 0 :(得分:6)

使用Aggregation example中显示的$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)])}  # <---
]) 

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

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

答案 1 :(得分:0)

您可能想要使用$sort。同时检查Mongo docs

答案 2 :(得分:0)

聚合管道具有$sort管道阶段:

data =  db.collection.aggregate([
   { "$match":{"created_at":{"$gte":start,"$lt":end} }},
   { "$group":{ "_id":"$stage","count":{"$sum":1} }},
   { "$match":{
       "count":{  "$gt": 296 }  # query trimmed because your question listing is incomplete
   }},
   { "$sort": { "count": -1 } }   # Actual sort stage
])

另一个.sort()方法用于“游标”,它与聚合管道不同。