MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

pymongo.errors.CursorNotFound :ID de curseur '...' non valide sur le serveur

Vous obtenez cette erreur car le curseur expire sur le serveur (après 10 minutes d'inactivité).

À partir de la documentation de pymongo :

Les curseurs dans MongoDB peuvent expirer sur le serveur s'ils sont ouverts depuis longtemps sans qu'aucune opération ne soit effectuée dessus. Cela peut entraîner la levée d'une exception CursorNotFound lors d'une tentative d'itération du curseur.

Lorsque vous appelez la collection.find méthode, il interroge une collection et renvoie un curseur vers les documents. Pour obtenir les documents, vous parcourez le curseur. Lorsque vous parcourez le curseur, le pilote envoie en fait des demandes au serveur MongoDB pour extraire plus de données du serveur. La quantité de données renvoyées dans chaque requête est définie par le batch_size() méthode.

À partir de la documentation :

Limite le nombre de documents renvoyés en un seul lot. Chaque lot nécessite un aller-retour vers le serveur. Il peut être ajusté pour optimiser les performances et limiter le transfert de données.

Définir le batch_size sur une valeur inférieure vous aidera avec les erreurs d'expiration de délai, mais cela augmentera le nombre de fois où vous aurez accès au serveur MongoDB pour obtenir tous les documents.

La taille de lot par défaut :

Pour la plupart des requêtes, le premier lot renvoie 101 documents ou juste assez de documents pour dépasser 1 mégaoctet. La taille du lot ne dépassera pas la taille maximale du document BSON (16 Mo).

Il n'y a pas de taille de lot "correcte" universelle. Vous devriez tester avec différentes valeurs et voir quelle est la valeur appropriée pour votre cas d'utilisation, c'est-à-dire combien de documents pouvez-vous traiter dans une fenêtre de 10 minutes.

Le dernier recours sera de définir no_cursor_timeout=True . Mais vous devez vous assurer que le curseur est fermé une fois que vous avez terminé de traiter les données.

Comment l'éviter sans try/except :

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