Tato chyba se zobrazuje, protože kurzor na serveru vyprší (po 10 minutách nečinnosti).
Z dokumentace pymongo:
Kurzory v MongoDB mohou vypršet na serveru, pokud byly otevřené po dlouhou dobu, aniž by na nich byly provedeny nějaké operace. To může vést k vyvolání výjimky CursorNotFound při pokusu o iteraci kurzoru.
Když zavoláte collection.find
metodou dotazuje kolekci a vrací kurzor na dokumenty. Chcete-li získat dokumenty, iterujte kurzor. Když iterujete přes kurzor, ovladač ve skutečnosti odesílá požadavky na server MongoDB, aby načetl další data ze serveru. Množství dat vrácených v každém požadavku je nastaveno pomocí batch_size()
metoda.
Z dokumentace:
Omezuje počet dokumentů vrácených v jedné dávce. Každá dávka vyžaduje zpáteční cestu na server. Lze jej upravit tak, aby optimalizoval výkon a omezil přenos dat.
Nastavení batch_size na nižší hodnotu vám pomůže s chybami při vypršení časového limitu, ale zvýší se počet případů, kdy budete mít přístup k serveru MongoDB, abyste získali všechny dokumenty.
Výchozí velikost dávky:
U většiny dotazů vrátí první dávka 101 dokumentů nebo jen tolik dokumentů, aby přesáhly 1 megabajt. Velikost dávky nepřekročí maximální velikost dokumentu BSON (16 MB).
Univerzální "správná" velikost šarže neexistuje. Měli byste testovat s různými hodnotami a zjistit, jaká je vhodná hodnota pro váš případ použití, tj. kolik dokumentů můžete zpracovat za 10 minut.
Poslední možností bude nastavení no_cursor_timeout=True
. Musíte se ale ujistit, že po dokončení zpracování dat je kurzor zavřený.
Jak se tomu vyhnout bez try/except
:
cursor = collection.find(
{"x": 1},
no_cursor_timeout=True
)
for doc in cursor:
# do something with doc
cursor.close()