如何摆脱mongodb中的游标id错误?

时间:2015-09-23 04:46:42

标签: python mongodb pymongo

我在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.

3 个答案:

答案 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)

请显示更多代码。我怀疑你的光标 只是已过期

mongodb manual

中所述
  

默认情况下,服务器将在10后自动关闭光标   几分钟不活动或客户端已用尽光标。

这意味着,在您创建光标records并使用一次后耗尽它之后,例如

mylist = [ i for i in records]

您的records光标不再存在

另请参阅thisthis个问题