2015-05-19 64 views
8

我想要獲取數據庫中條目最多的人列表。mongodb,pymongo,聚合給出了奇怪的輸出(關於光標的東西)

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

的條目是這樣的:

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

我知道created.user存在,否則訪問。

還是輸出我得到的是:

<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>

我不應該得到一個排序列表?

回答

16

聚合查詢的結果是一個遊標,對於常規的find查詢。在pymongo情況下,CommandCursor是迭代的,因此你可以做任何操作:

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

# Option 1 
print(list(cursor)) 

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

注:arun noticed,在這兩種情況下,也就是你出了光標的創建列表後,或者在for循環中迭代,您將無法重新遍歷遊標。在這種情況下,如果將來要使用它,第一個選項會變得更好,因爲您可以儘可能多地使用獲取的列表,因爲它已經在內存中。
無法重複的原因是遊標實際上在服務器上,並且它會逐塊發送數據,並且在它發送了所有數據(或服務器終止)之後,遊標被破壞。

+0

正如謹慎(雖然你清楚地提到他們作爲兩個選項):獲得列表後,你不能再次迭代光標。你必須迭代列表。 – arun

+0

感謝您的通知,結帳更新:) – bagrat

+3

使用列表(光標)似乎不工作時下。它在參數中給出***錯誤:'(cursor)' – user541905