1

这是 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

有谁知道这个失败是什么,以及如何将它变成一个异常来继续我的脚本,即使在这个失败的情况下?

谢谢

4

1 回答 1

1

问题的原因在pymongo 的 FAQ中有描述:

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

这是因为collection.find()timeout的论点:

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

传递timeout=Falsefind应该解决问题:

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

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

另见:

于 2013-08-26T21:47:00.793 回答