以下是Pymongo的查询
import mong #just my library for initializing
collection_1 = mong.init(collect="col_1")
collection_2 = mong.init(collect="col_2")
for name in collection_2.find({"field1":{"$exists":0}}):
try:
to_query = name['something']
actual_id = collection_1.find_one({"something":to_query})['_id']
crap_id = name['_id']
collection_2.update({"_id":id},{"$set":{"new_name":actual_id}},upset=True)
except:
open('couldn_find_id.txt','a').write(name)
所有这一切都是从一个集合中获取一个字段,找到该字段的id并更新另一个集合的id。它适用于大约1000-5000次迭代,但是会定期失败,然后我必须重新启动脚本。
> Traceback (most recent call last):
File "my_query.py", line 6, in <module>
for name in collection_2.find({"field1":{"$exists":0}}):
File "/home/user/python_mods/pymongo/pymongo/cursor.py", line 814, in next
if len(self.__data) or self._refresh():
File "/home/user/python_mods/pymongo/pymongo/cursor.py", line 776, in _refresh
limit, self.__id))
File "/home/user/python_mods/pymongo/pymongo/cursor.py", line 720, in __send_message
self.__uuid_subtype)
File "/home/user/python_mods/pymongo/pymongo/helpers.py", line 98, in _unpack_response
cursor_id)
pymongo.errors.OperationFailure: cursor id '7578200897189065658' not valid at server
^C
bye
有没有人知道这次失败是什么,以及即使在这次失败时我如何将其变为异常以继续我的脚本?
由于
答案 0 :(得分:1)
如果MongoDB中的游标已经打开,它们可以在服务器上超时 很长一段时间没有对它们进行任何操作。这个可以 导致在尝试时引发的OperationFailure异常 迭代光标。
这是因为collection.find()的timeout
参数:
timeout(可选):如果为True(默认值),则返回任何游标 在10分钟不活动后由服务器关闭。如果设置为False, 返回的游标永远不会在服务器上超时。应该小心 用于确保关闭超时的游标正确 闭合。
将timeout=False
传递给find
可以解决问题:
for name in collection_2.find({"field1":{"$exists":0}}, timeout=False):
但是,请确保正确关闭光标。
另见: