2015-09-23 45 views
2

我在pymongo嘗試下面的命令:如何擺脫mongodb中的光標id錯誤?

records= db.collection_name.find({"gender":"female"}).batch_size(5) 

但幾次迭代後得出:

pymongo.errors.CursorNotFound: Cursor not found, cursor id: 61593385827. 

另外,如果我嘗試timeout=False在同一個命令即

records= db.collection_name.find({"gender":"female"},timeout=False).batch_size(5) 

其給出

TypeError: __init__() got an unexpected keyword argument 'timeout' error. 

回答

1

請顯示更多的代碼。我懷疑你光標 只是已過期

mongodb manual

描述默認情況下,服務器將自動關閉遊標10 分鐘靜止狀態後,或者如果客戶端已用盡光標。

這意味着,您所創建的光標records,並通過使用一次,例如用完它,就像

mylist = [ i for i in records] 

後您的records光標不存在了

參見thisthis問題

6

嘗試在查詢中設置no_cursor_timeout=True,如下所示:

records= db.collection_name.find({"gender":"female"}, no_cursor_timeout=True).batch_size(5)

2

設置timeout=False是一個非常糟糕的做法。擺脫遊標ID超時異常的更好方法是估計循環可以在10分鐘內處理多少個文檔,並提出一個保守的批量大小。這樣,每當上一批中的文檔用完時,MongoDB客戶端(在這種情況下,PyMongo)將不得不一次查詢服務器。這將使光標在服務器上保持活動狀態,並且您仍然可以享受到10分鐘的超時保護。

這裏是你如何設置批量大小光標:

for doc in coll.find().batch_size(30): 
    do_time_consuming_things()