Ответ 1
Вы получаете эту ошибку, потому что время ожидания курсора на сервере (после 10 минут бездействия).
Из документации по пимонго:
Курсоры в MongoDB могут тайм-аут на сервере, если они были открыты для долгое время без каких-либо операций над ними. Это может привести к возникновению исключения CursorNotFound при попытке итерируйте курсор.
Когда вы вызываете метод collection.find
, он запрашивает коллекцию и возвращает курсор на документы. Чтобы получить документы, вы перебираете курсор. Когда вы перебираете курсор, драйвер фактически делает запросы серверу MongoDB для получения дополнительных данных с сервера. Количество данных, возвращаемых в каждом запросе, устанавливается методом batch_size()
.
Из документации:
Ограничивает количество документов, возвращаемых в одной партии. Каждая партия требует поездки в оба конца на сервер. Это можно настроить для оптимизации производительность и ограничение передачи данных.
Установка более низкого значения batch_size поможет вам при ошибках тайм-аута, но увеличит количество обращений к серверу MongoDB для получения всех документов.
Размер пакета по умолчанию:
Для большинства запросов первая партия возвращает 101 документ или достаточно документы превышают 1 мегабайт. Размер пакета не должен превышать максимальный размер документа BSON (16 МБ).
Универсального "правильного" размера партии не существует. Вы должны проверить с различными значениями и посмотреть, какое значение подходит для вашего варианта использования, то есть сколько документов вы можете обработать в 10-минутном окне.
В крайнем случае вы установите no_cursor_timeout=True
. Но вы должны быть уверены, что курсор будет закрыт после завершения обработки данных.
Пример:
cursor = collection.find({"x": 1}, no_cursor_timeout=True)
for doc in cursor:
# do something with doc
cursor.close()