2015-09-23 2 views
2

Я попробовал следующую команду в PyMongo:Как избавиться от ошибки идентификатора курсора в mongodb?

records= db.collection_name.find({"gender":"female"}).batch_size(5) 

, но после нескольких итераций дает:

pymongo.errors.CursorNotFound: Cursor not found, cursor id: 61593385827. 

Кроме того, если я пытаюсь timeout=False в одной команде т.е.

records= db.collection_name.find({"gender":"female"},timeout=False).batch_size(5) 

его дает

TypeError: __init__() got an unexpected keyword argument 'timeout' error. 

ответ

1

Пожалуйста, покажите больше своего кода. Я подозреваю, что вы курсор всего expired.

Как описано в mongodb manual

По умолчанию сервер автоматически закрывает курсор после 10 минут бездействия или, если клиент исчерпал курсор.

Это означает, что после того, как вы создали курсор records и исчерпываются его, используя один раз, например, как

mylist = [ i for i in records] 

ваш records курсор больше не существует

Смотрите также this и this вопросы

6

Попробуйте установить no_cursor_timeout=True в запросе, например:

records= db.collection_name.find({"gender":"female"}, no_cursor_timeout=True).batch_size(5)

2

Установка timeout=False - очень плохая практика. Лучший способ избавиться от исключения тайм-аута идентификатора курсора - оценить количество документов, которые ваш цикл может обрабатывать в течение 10 минут, и придумать консервативный размер партии. Таким образом, клиент MongoDB (в данном случае, PyMongo) будет запрашивать сервер один раз в то время, когда были израсходованы документы предыдущей партии. Это будет держать курсор активным на сервере, и вы все равно будете защищены 10-минутным тайм-аутом.

Вот как вы установите размер пакета для курсора:

for doc in coll.find().batch_size(30): 
    do_time_consuming_things() 
Смежные вопросы