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>
Разве я не должен получить сортированный список ?
1 ответ:
Результатом запроса агрегации является курсор, как и для обычного запроса
find. В случаеpymongoCommandCursorявляется итерационным, таким образом, вы можете сделать любое из следующих действий:cursor = db.points.aggregate(...) # Option 1 print(list(cursor)) # Option 2 for document in cursor: print(document)Примечание: как заметил Арун , в обоих случаях, то есть после создания списка из курсора или итерации в цикле for, вы не сможете повторить итерацию над курсором. В этом случае первый вариант становится лучше, если вы хотите использовать его в будущем, так как вы можете использовать полученный перечисляйте сколько угодно, потому что это уже есть в памяти.
Причина невозможности повторить заключается в том, что курсор фактически находится на сервере, и он отправляет данные по частям, а после того, как он отправил вам все данные (или сервер завершает работу), курсор уничтожается.
Comments