Я получаю все данные некоторой коллекции в 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
На всякий случай использую:
Попробуйте установить тайм-аут курсора глобально через параметр cursorTimeoutMillis
.
В терминале введите:
$ mongod --setParameter cursorTimeoutMillis=600000
См. 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
Я пробовал это, но я все еще получаю эту ошибку