2015-05-19 11 views
8

Ich versuche, eine Liste von Menschen mit den meisten Einträge in meiner Datenbank zu bekommen.mongodb, pymongo, Aggregat gibt seltsame Ausgabe (etwas über den Cursor)

print db.points.aggregate(
    [ 
     { 
     "$group": 
        { 
         "_id": "$created.user", 
         "count":{"$sum":1} 
        } 
     }, 
     { 
     "$sort": 
        {"count":-1} 
     } 
    ] 
) 

Ein Eintrag sieht wie folgt aus:

{ 
    u'id': u'342902', 
    u'_id': ObjectId('555af76a029d3b1b0ff9a4be'), 
    u'type': u'node', 
    u'pos': [48.9979746, 8.3719741], 
    u'created': { 
        u'changeset': u'7105928', 
        u'version': u'4', 
        u'uid': u'163673', 
        u'timestamp': u'2011-01-27T18:05:54Z', 
        u'user': u'Free_Jan' 
       } 
} 

Ich weiß, dass created.user existiert und sonst zugänglich.

noch der Ausgang i erhalten ist:

<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>

Sollte ich nicht eine sortierte Liste bekommen?

Antwort

16

Das Ergebnis einer Aggregationsabfrage ist ein Cursor, wie bei einer normalen find Abfrage. Im Falle von pymongo die CommandCursor ist iterable, so können Sie eine der zu folgenden Aktionen:

cursor = db.points.aggregate(...) 

# Option 1 
print(list(cursor)) 

# Option 2 
for document in cursor: 
    print(document) 

Hinweis: als arun noticed, in beiden Fällen, das heißt, nachdem Sie eine Liste aus dem Cursor erstellen oder in der for-Schleife iterieren, können Sie den Cursor nicht erneut durchlaufen. In diesem Fall wird die erste Option besser, wenn Sie sie in Zukunft verwenden möchten, da Sie die Liste so oft verwenden können, wie Sie möchten, weil sie bereits im Speicher vorhanden ist.
Der Grund, nicht wiederholen zu können, ist, dass der Cursor tatsächlich auf dem Server ist, und die Daten Stück für Stück senden, und nachdem Sie alle Daten gesendet haben (oder der Server endet), wird der Cursor zerstört .

+0

Genauso vorsichtig (obwohl Sie sie eindeutig als zwei Optionen angeben): Nachdem Sie die Liste abgerufen haben, können Sie den Cursor nicht noch einmal durchlaufen. Sie müssen auf der Liste iterieren. – arun

+0

Danke für die Nachricht, checkout das Update :) – bagrat

+3

Die Verwendung der Liste (Cursor) scheint nicht zu funktionieren heutzutage. Es gibt *** Fehler im Argument: '(Cursor)' – user541905