2015-05-19 23 views
8

Tôi đang cố gắng có được một danh sách những người có nhiều mục nhập nhất trong cơ sở dữ liệu của tôi.mongodb, pymongo, tổng hợp cho đầu ra lạ (một cái gì đó về con trỏ)

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

Một mục trông như thế này:

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

Tôi biết rằng created.user tồn tại và nếu không thể truy cập.

Tuy nhiên đầu ra tôi nhận được là:

<pymongo.command_cursor.CommandCursor object at 0x02ADD6B0>

nên tôi không nhận được một danh sách được sắp xếp?

Trả lời

16

Kết quả của truy vấn tổng hợp là con trỏ, như đối với truy vấn thông thường find. Trong trường hợp của pymongo các CommandCursor là iterable, do đó bạn có thể làm bất cứ điều nào sau đây:

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

# Option 1 
print(list(cursor)) 

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

Lưu ý: như arun noticed, trong cả hai trường hợp, tức là sau khi bạn tạo một danh sách hiện của con trỏ hoặc lặp lại trong vòng lặp for, bạn sẽ không thể lặp lại qua con trỏ. Trong trường hợp đó, tùy chọn đầu tiên trở nên tốt hơn, nếu bạn muốn sử dụng nó trong tương lai, vì bạn có thể sử dụng danh sách thu được nhiều như bạn muốn, bởi vì nó nằm trong bộ nhớ rồi.
Lý do không thể nhắc lại là con trỏ thực sự nằm trên máy chủ và gửi dữ liệu theo từng đoạn và sau khi nó gửi cho bạn tất cả dữ liệu (hoặc máy chủ kết thúc) con trỏ bị hủy .

+0

Cũng như thận trọng (mặc dù bạn đề cập rõ ràng chúng là hai tùy chọn): sau khi nhận được danh sách, bạn không thể lặp lại trên con trỏ. Bạn phải lặp lại trong danh sách. – arun

+0

Cảm ơn thông báo, kiểm tra cập nhật :) – bagrat

+3

Sử dụng danh sách (con trỏ) dường như không hoạt động ngày nay. Nó cho *** Lỗi trong đối số: '(con trỏ)' – user541905

Các vấn đề liên quan