2015-05-19 3 views
8

Я пытаюсь получить список людей с наибольшим количеством записей в моей базе данных.mongodb, pymongo, aggregate дает странный вывод (что-то о курсоре)

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. В случае pymongoCommandCursor является итерацию, таким образом, вы можете сделать одно из следующих действий:

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

Смежные вопросы