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>



Разве я не должен получить сортированный список ?

750   1  

1 ответ:

Результатом запроса агрегации является курсор, как и для обычного запроса find. В случае pymongo CommandCursor является итерационным, таким образом, вы можете сделать любое из следующих действий:

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

# Option 1
print(list(cursor))

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

Примечание: как заметил Арун , в обоих случаях, то есть после создания списка из курсора или итерации в цикле for, вы не сможете повторить итерацию над курсором. В этом случае первый вариант становится лучше, если вы хотите использовать его в будущем, так как вы можете использовать полученный перечисляйте сколько угодно, потому что это уже есть в памяти.
Причина невозможности повторить заключается в том, что курсор фактически находится на сервере, и он отправляет данные по частям, а после того, как он отправил вам все данные (или сервер завершает работу), курсор уничтожается.

Comments

    Ничего не найдено.