2016-04-12 15 views
3

bir PyMongo sorgunun sonuç:Sıralama şöyle bir MongoDB sorgu var

aşağıdaki çıkışı sonuçlanır
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'} 

Ben sayımına göre çıkışını sıralamak için çalışıyorum 'sütunu:

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

... ama aşağıdaki hatayı alıyorum:

'CommandCursor' object has no attribute 'sort' 

Bu hata nedenini açıklayabilir mi? Aggregation example gösterildiği gibi $sort Kullanılması

cevap

5

:

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)])} # <--- 
]) 

alternatif genel bir çözüm: özel anahtar işlevi ile sorted kullanın:

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

'SON' isminin tanımlanmadığını belirten bir hata alıyorum ama diğer alternatif mükemmel çalışıyor – Prakash

+0

@Pashash, Kodun ilk satırında gösterildiği gibi içe aktardınız mı? – falsetru

+0

Çalıştığınız için teşekkürler ama bu da çalıştı: {"$ sort": {"count": -1}} - aralarında bir fark var mı? – Prakash

0

Toplama boru hatları bir $sort boru hattı aşaması vardır:

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 
]) 

diğer .sort() yöntem toplama boru hattı yaptığından farklı bir "imleç" içindir.