sql >> Databasteknik >  >> NoSQL >> MongoDB

pymongo.errors.CursorNotFound:markör-id '...' inte giltigt på servern

Du får det här felet eftersom markören håller på att ta slut på servern (efter 10 minuters inaktivitet).

Från pymongo-dokumentationen:

Markörer i MongoDB kan timeout på servern om de har varit öppna under en längre tid utan att några operationer utförs på dem. Detta kan leda till att ett CursorNotFound-undantag höjs vid försök att upprepa markören.

När du ringer collection.find metod frågar den efter en samling och den returnerar en markör till dokumenten. För att få fram dokumenten upprepar du markören. När du itererar över markören gör föraren faktiskt förfrågningar till MongoDB-servern för att hämta mer data från servern. Mängden data som returneras i varje begäran ställs in av batch_size() metod.

Från dokumentationen:

Begränsar antalet dokument som returneras i en batch. Varje batch kräver en tur och retur till servern. Den kan justeras för att optimera prestanda och begränsa dataöverföring.

Att ställa in batch_size till ett lägre värde hjälper dig med timeout-felen, men det kommer att öka antalet gånger du kommer att få åtkomst till MongoDB-servern för att få alla dokument.

Standard batchstorlek:

För de flesta frågor returnerar den första batchen 101 dokument eller bara tillräckligt många dokument för att överstiga 1 megabyte. Batchstorleken kommer inte att överskrida den maximala BSON-dokumentstorleken (16 MB).

Det finns ingen universell "rätt" batchstorlek. Du bör testa med olika värden och se vad som är lämpligt värde för ditt användningsfall, dvs. hur många dokument kan du bearbeta inom ett 10-minutersfönster.

Den sista utvägen är att du ställer in no_cursor_timeout=True . Men du måste vara säker på att markören är stängd efter att du avslutat bearbetningen av data.

Hur man undviker det utan att try/except :

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


  1. Mongodb Aggregation Framework | Gruppera över flera värden?

  2. Tillkännage ClusterControl 1.4.2 - DevOps Edition

  3. Pop flera värden från Redis datastruktur atomärt?

  4. MongoDB deleteOne()