2013-08-26 39 views
1

這裏是PymongoPymongo失敗,但不會放棄例外

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

問題的原因在pymongo's FAQ描述:

光標MongoDB中可以在服務器上超時,如果他們已經打開 執行上沒有任何操作的很長一段時間他們。當嘗試 迭代遊標時,可能會導致 引發OperationFailure異常。

這是因爲collection.find()timeout說法:

超時(可選):如果True(默認),任何返回光標 閒置10分鐘後,服務器關閉。如果設置爲False,則 返回的光標永遠不會在服務器上超時。應注意採取 以確保關閉超時的遊標正確關閉 。

傳遞timeout=Falsefind應該解決的問題:

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

但是,一定要正確關閉遊標。

另見: