3

ich eine MongoDB Abfrage haben wie folgt:sortieren das Ergebnis aus einer PyMongo Abfrage

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

, die in der folgenden Ausgabe führt:

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

Ich versuche, die Ausgabe von der ‚Zählung zu sortieren 'Säule:

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

... aber ich bin immer folgende Fehlermeldung:

'CommandCursor' object has no attribute 'sort' 

Kann jemand den Grund für diesen Fehler erklären?

Antwort

5

Mit $sort wie in Aggregation example gezeigt:

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

alternative allgemeine Lösung: Verwenden Sie sorted mit benutzerdefinierten Schlüsselfunktion:

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

Ich bekomme einen Fehler unter Angabe des Namens 'SON' ist nicht definiert, aber die andere Alternative funktioniert perfekt – Prakash

+0

@Prakash, Haben Sie es importiert, wie in der ersten Zeile des Codes gezeigt? – falsetru

+0

Danke, es hat funktioniert, aber dieses hat auch funktioniert: {"$ sort": {"count": -1}} - gibt es einen Unterschied zwischen ihnen? – Prakash

0

Möglicherweise möchten Sie $sort verwenden. Überprüfen Sie auch Mongo docs.

0

Aggregation Rohrleitungen haben eine $sort Pipeline-Stufe:

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

Die andere .sort() Methode ist für einen "Cursor", die sich von dem unterscheidet, was die Aggregation Pipeline tut.