MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

pymongo.errors.CursorNotFound:ID cursore '...' non valido sul server

Ricevi questo errore perché il cursore è in timeout sul server (dopo 10 minuti di inattività).

Dalla documentazione di pymongo:

I cursori in MongoDB possono andare in timeout sul server se sono stati aperti per molto tempo senza che venga eseguita alcuna operazione su di essi. Ciò può comportare la generazione di un'eccezione CursorNotFound quando si tenta di scorrere il cursore.

Quando chiami collection.find metodo interroga una raccolta e restituisce un cursore ai documenti. Per ottenere i documenti, scorrere il cursore. Quando si esegue un'iterazione sul cursore, il driver sta effettivamente effettuando richieste al server MongoDB per recuperare più dati dal server. La quantità di dati restituiti in ogni richiesta è impostata da batch_size() metodo.

Dalla documentazione:

Limita il numero di documenti restituiti in un batch. Ogni batch richiede un viaggio di andata e ritorno al server. Può essere regolato per ottimizzare le prestazioni e limitare il trasferimento dei dati.

L'impostazione di batch_size su un valore inferiore ti aiuterà con gli errori di timeout, ma aumenterà il numero di volte in cui avrai accesso al server MongoDB per ottenere tutti i documenti.

La dimensione batch predefinita:

Per la maggior parte delle query, il primo batch restituisce 101 documenti o solo documenti sufficienti per superare 1 megabyte. La dimensione del batch non supererà la dimensione massima del documento BSON (16 MB).

Non esiste una dimensione batch "giusta" universale. Dovresti testare con valori diversi e vedere qual è il valore appropriato per il tuo caso d'uso, ad esempio quanti documenti puoi elaborare in una finestra di 10 minuti.

L'ultima risorsa sarà impostare no_cursor_timeout=True . Ma devi essere sicuro che il cursore sia chiuso al termine dell'elaborazione dei dati.

Come evitarlo senza try/except :

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