2016-10-29 5 views
0

Я пытаюсь отсортировать коллекцию, а затем напечатать первые 5 докторов, чтобы убедиться, что он работает:Простой скрипт не печатает

#!/user/bin/env python 

import pymongo 

# Establish a connection to the mongo database. 
connection = pymongo.MongoClient('mongodb://localhost') 

# Get a handle to the students database. 
db = connection.school 
students = db.students 


def order_homework(): 

    projection = {'scores': {'$elemMatch': {'type': 'homework'}}} 
    cursor = students.find({}, projection) 

    # Sort each item's scores. 
    for each in cursor: 
     each['scores'].sort() 

    # Sort by _id. 
    cursor = sorted(cursor, key=lambda x: x['_id']) 

    # Print the first five items. 
    count = 0 
    for each in cursor: 
     print(each) 
     count += 1 
     if count == 5: 
      break 


if __name__ == '__main__': 
    order_homework() 

Когда я запускаю это, ничего не печатает.
Если я выберу сортировку, она будет напечатана.
Каждый вид работает при запуске отдельно.

Пожалуйста, научите меня тому, что я делаю неправильно/воспитываю меня.

+0

, если у вас нет ошибок и никаких отпечатков в одно и то же время означает, что цикл не был выполнен. Поэтому взгляните на то, что находится внутри курсора - возможно, у него нет записей внутри - скорее всего, он просто пуст. –

+0

Что такое 'cursor' - список или итератор? итератор после первой итерации ничего не показывает. – furas

+0

'' cursor'' содержит 200 документов в формате, показанном здесь: https://gist.github.com/BigGingerJake/82d9dc89d534ff331e0783d2c4fc6e42, если я запускаю код для переменных '' projection'' и '' cursor'' независимо от mongo клиент. Я вижу, что '' cursor'' содержит документы. –

ответ

2

Вы пытаетесь обработать курсор как список, который вы можете повторить несколько раз с самого начала. Курсоры PyMongo не действуют таким образом - после того, как вы повторили его в for each in cursor, курсор завершен, и вы не можете повторять его снова.

Вы можете включить курсор в список, как:

data = list(students.find({}, projection)) 

Для эффективности, получить результаты предварительно сортируется от MongoDB:

list(students.find({}, projection).sort('_id')) 

Это посылает критерий сортировки на сервер, который затем потоки результатов обратно к вам предварительно отсортированы, вместо того, чтобы требовать от вас сделать это на стороне клиента. Теперь удалите строку «Сортировать по _id» ниже.

+0

Благодарим вас, сэр. –

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