MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

pymongo.errors.CursorNotFound:Cursor-ID „...“ auf dem Server nicht gültig

Sie erhalten diesen Fehler, weil der Cursor auf dem Server abläuft (nach 10 Minuten Inaktivität).

Aus der Pymongo-Dokumentation:

Cursor in MongoDB können auf dem Server ablaufen, wenn sie längere Zeit geöffnet waren, ohne dass an ihnen Vorgänge ausgeführt wurden. Dies kann dazu führen, dass eine CursorNotFound-Ausnahme ausgelöst wird, wenn versucht wird, den Cursor zu iterieren.

Beim Aufruf der collection.find Methode fragt es eine Sammlung ab und gibt einen Cursor zu den Dokumenten zurück. Um die Dokumente zu erhalten, iterieren Sie den Cursor. Wenn Sie über den Cursor iterieren, stellt der Treiber tatsächlich Anforderungen an den MongoDB-Server, um weitere Daten vom Server abzurufen. Die bei jeder Anfrage zurückgegebene Datenmenge wird durch batch_size() festgelegt Methode.

Aus der Dokumentation:

Begrenzt die Anzahl der Dokumente, die in einem Stapel zurückgegeben werden. Jeder Stapel erfordert einen Roundtrip zum Server. Es kann angepasst werden, um die Leistung zu optimieren und die Datenübertragung einzuschränken.

Das Festlegen von „batch_size“ auf einen niedrigeren Wert hilft Ihnen bei den Zeitüberschreitungsfehlern , erhöht jedoch die Häufigkeit, mit der Sie auf den MongoDB-Server zugreifen, um alle Dokumente abzurufen.

Die Standardstapelgröße:

Bei den meisten Abfragen gibt der erste Stapel 101 Dokumente oder gerade genug Dokumente zurück, um 1 Megabyte zu überschreiten. Die Stapelgröße wird die maximale BSON-Dokumentgröße (16 MB) nicht überschreiten.

Es gibt keine universelle „richtige“ Chargengröße. Sie sollten mit verschiedenen Werten testen und sehen, welcher Wert für Ihren Anwendungsfall geeignet ist, d. h. wie viele Dokumente Sie in einem 10-Minuten-Fenster verarbeiten können.

Als letzte Möglichkeit setzen Sie no_cursor_timeout=True . Aber Sie müssen sicher sein, dass der Cursor geschlossen ist, nachdem Sie die Verarbeitung der Daten beendet haben.

Wie man es ohne try/except vermeidet :

cursor = collection.find(
     {"x": 1},
     no_cursor_timeout=True
)
for doc in cursor:
    # do something with doc
cursor.close()