Как решить эту ошибку Pymongo? идентификатор курсора не найден

Я получаю все данные некоторой коллекции в MongoDB, и через некоторое время (например, 30 или 60 минут) скрипт выдает следующую ошибку:

pymongo.errors.CursorNotFound: идентификатор курсора 1801580172063793986 не найден, полная ошибка: {'ok': 0.0, 'errmsg': 'идентификатор курсора 1801580172063793986 не найден', 'code': 43, 'codeName': 'CursorNotFound'}

Эта ошибка возникает после 24k документов. Я использую Django и Pymongo, подключенные к базе данных на локальном сервере. В коллекции около 60 тыс. документов.

Вот как я получаю данные:

client = MongoClient(settings.MONGO_HOST, settings.MONGO_PORT)
collection = client[settings.MONGO_DB].collection
cursor = collection.find(no_cursor_timeout=True)
for document in cursor:
    # getting the data from the user

На всякий случай использую:

  • Питон 3.8
  • Джанго 3.1.4
  • Пимонго 3.11.0
  • Mongod 4.4.2 (для локального сервера)
  • Убунту 20.04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
3 772
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Попробуйте установить тайм-аут курсора глобально через параметр cursorTimeoutMillis.

В терминале введите:

$ mongod --setParameter cursorTimeoutMillis=600000

Я пробовал это, но я все еще получаю эту ошибку

DonLarry 15.12.2020 03:54

См. https://jira.mongodb.org/browse/SERVER-36808 и соответствующие связанные билеты.

Сервер может уничтожать сеансы, используемые открытыми курсорами, в результате чего эти курсоры становятся непригодными для использования.

https://jira.mongodb.org/browse/PYTHON-1626 может быть полезно, хотя мне кажется, что проблема на стороне сервера и на данный момент не решена.

Ответ принят как подходящий

Это не решение ошибки, но это способ избежать ошибки. Чтобы использовать курсор за минимально возможное время, вы можете сохранить все данные в виде списка или что-то в этом роде.

client = MongoClient(settings.MONGO_HOST, settings.MONGO_PORT)
collection = client[settings.MONGO_DB].collection
cursor = collection.find(no_cursor_timeout=True)

collection_data = [document for document in cursor]
for document in collection_data:
    # using the data

Другие вопросы по теме