我在pymongo中尝试了以下命令:
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.
答案 0 :(得分:8)
尝试在查询中设置no_cursor_timeout=True
,如下所示:
records= db.collection_name.find({"gender":"female"}, no_cursor_timeout=True).batch_size(5)
答案 1 :(得分:3)
设置timeout=False
是一种非常糟糕的做法。摆脱游标id超时异常的更好方法是估计循环在10分钟内可以处理的文档数量,并提出保守的批量大小。这样,只要前一批中的文档用完,MongoDB客户端(在本例中为PyMongo)就必须偶尔查询一次服务器。这将使光标在服务器上保持活动状态,您仍将受到10分钟超时保护的保护。
以下是为光标设置批量大小的方法:
for doc in coll.find().batch_size(30):
do_time_consuming_things()
答案 2 :(得分:1)
请显示更多代码。我怀疑你的光标 只是已过期。
中所述默认情况下,服务器将在10后自动关闭光标 几分钟不活动或客户端已用尽光标。
这意味着,在您创建光标records
并使用一次后耗尽它之后,例如
mylist = [ i for i in records]
您的records
光标不再存在