Pymongo失败但不会例外

时间:2013-08-26 21:40:40

标签: python mongodb pymongo

以下是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

有没有人知道这次失败是什么,以及即使在这次失败时我如何将其变为异常以继续我的脚本?

由于

1 个答案:

答案 0 :(得分:1)

pymongo's FAQ

中描述了问题的原因
  

如果MongoDB中的游标已经打开,它们可以在服务器上超时   很长一段时间没有对它们进行任何操作。这个可以   导致在尝试时引发的OperationFailure异常   迭代光标。

这是因为collection.find()timeout参数:

  

timeout(可选):如果为True(默认值),则返回任何游标   在10分钟不活动后由服务器关闭。如果设置为False,   返回的游标永远不会在服务器上超时。应该小心   用于确保关闭超时的游标正确   闭合。

timeout=False传递给find可以解决问题:

for name in collection_2.find({"field1":{"$exists":0}}, timeout=False):

但是,请确保正确关闭光标。

另见: