U krijgt deze foutmelding omdat de cursor een time-out heeft op de server (na 10 minuten inactiviteit).
Uit de pymongo-documentatie:
Cursors in MongoDB kunnen een time-out krijgen op de server als ze lange tijd open zijn geweest zonder dat er bewerkingen op zijn uitgevoerd. Dit kan ertoe leiden dat er een CursorNotFound-uitzondering wordt gegenereerd wanneer wordt geprobeerd de cursor te herhalen.
Wanneer u de collection.find
. aanroept methode bevraagt het een verzameling en retourneert het een cursor naar de documenten. Om de documenten te krijgen, herhaalt u de cursor. Wanneer u over de cursor heen gaat, doet het stuurprogramma eigenlijk verzoeken aan de MongoDB-server om meer gegevens van de server op te halen. De hoeveelheid gegevens die in elk verzoek wordt geretourneerd, wordt ingesteld door de batch_size()
methode.
Uit de documentatie:
Beperkt het aantal documenten dat in één batch wordt geretourneerd. Elke batch vereist een retour naar de server. Het kan worden aangepast om de prestaties te optimaliseren en de gegevensoverdracht te beperken.
Als u de batch_size instelt op een lagere waarde, kunt u de time-outfouten voorkomen, maar het verhoogt het aantal keren dat u toegang krijgt tot de MongoDB-server om alle documenten op te halen.
De standaard batchgrootte:
Voor de meeste zoekopdrachten retourneert de eerste batch 101 documenten of net genoeg documenten om 1 megabyte te overschrijden. Batchgrootte zal de maximale BSON-documentgrootte (16 MB) niet overschrijden.
Er is geen universele "juiste" batchgrootte. U moet testen met verschillende waarden en kijken wat de juiste waarde is voor uw gebruik, d.w.z. hoeveel documenten u in een tijdsbestek van 10 minuten kunt verwerken.
Het laatste redmiddel is dat u no_cursor_timeout=True
. instelt . Maar u moet er zeker van zijn dat de cursor wordt gesloten nadat u klaar bent met het verwerken van de gegevens.
Hoe het te vermijden zonder try/except
:
cursor = collection.find(
{"x": 1},
no_cursor_timeout=True
)
for doc in cursor:
# do something with doc
cursor.close()