2013-08-26 4 views
1

를 제공하지 않습니다 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

문제의 이유는 pymongo's FAQ에 설명되어 있습니다 : 그들이 어떤 작업없이 긴 시간에 수행되는 을 위해 열려 한 경우 MongoDB의에서

커서가 서버에서 시간 초과 수 그들. 이 커서를 시도 할 때 OperationFailure 예외가 발생할 수 있습니다.

이 때문에 collection.find()timeout 인수입니다 :

시간 제한 (선택 사항) : 참 (기본값), 어떤 커서가 비활성 10 분 후에 서버에 의해 폐쇄 입니다 반환합니다. False로 설정하면 반환 된 커서가 서버에서 절대로 종료되지 않습니다. 은 시간 종료가 해제 된 커서가 올바르게 닫히도록주의해야합니다. .

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

하지만, 커서를 올바르게 닫을 수 있습니다 확인 : 문제를 해결해야 findtimeout=False 전달

.

참조 :