2015-09-23 70 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()