2012-12-20 2 views
0

좌표 필드에 경도/위도 정보가없는 레코드를 수집하려고합니다. Google의 geocode() 메소드를 사용하여 좌표로 변환 할 위치 정보가있는 레코드를 선택한 다음 이전에 null이었던 coordinates 필드의 새 값을 업데이트하려고합니다.MongoDB의 필드를 새로운 값으로 업데이트하는 방법

find() 메서드를 사용하면 관련 레코드가 표시되지만이 코드 블록은 실행되지 않는 것처럼 보입니다. 즉, 레코드가 좌표 정보로 업데이트되지 않았습니다. 이것은 코드입니다 :

cursor = coll.find(
       {"$and": [ 
          {"coordinates": {"$type":10}}, 
          {"place": {"$ne": None}} 
        ]}, 
      {"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1}, tailable = True, timeout = False) 

while cursor.alive: 
    counter=0 
    g = geocoders.Google() 
    try: 
     doc = cursor.next() 
     current_id = doc['_id'] 
     counter+=1 
     print doc 
     placeName = doc['place']['full_name'] 
     loc = g.geocode(placeName) 
     coll.update({"_id" : current_id},{"$set": {"coordinates": loc[1]}}) 
     print doc   
     time.sleep(0.15)        
    except (ValueError, geocoders.google.GQueryError): 
     pass 

    except StopIteration: 
     break 

필드가 업데이트되지 않는 이유를 알 수 없습니다. 나는 print counter 반환 0

감사

+0

'coll'은 모자이크 컬렉션입니까? – JohnnyHK

+0

@JohnnyHK, 예'coll'은 출전자가됩니다. – user94628

+0

확인해 주시면 그에 대한 업데이트 된 답변을 참조하십시오. – JohnnyHK

답변

1

커플 일들이 있음을 알아 차리지 해요 :

쿼리 선택에서 여러 필드를 포함로 $and를 제거하기 위해 find 쿼리 조금 단순화 할 수 자연스럽게 '의 ands'그들 :

cursor = coll.find(
    { 
     {"coordinates": {"$type":10}}, 
     {"place": {"$ne": None}} 
    }, 
    {"coordinates": 1, "place": 1, "time_normal": 1, "_id": 1}, 
    tailable = True, timeout = False) 

하지만 그건 문제와 update 호출이 좋아 보인다 원인이되어서는 안된다. 그러나 find 호출시 문서의 모습을 보여주는 스냅 숏이기 때문에 update 호출로 인해 doc을 수정하지 않아도됩니다. 이 시점에서 find_one({"_id": current_id})으로 전화하여 업데이트 결과를 확인해야합니다.

아직 업데이트되지 않는 것으로 보이는 경우 업데이트 전에 loc[1]의 내용이 무엇인지 확인하여 원하는 내용인지 확인하십시오.

UPDATE

문제는 당신이 성장 할 문서의 크기를 일으키는 뒤덮인 모음을 업데이트하려는 가능성이 높습니다. docs에 따르면 업데이트가 실패하게됩니다.

+0

쿼리 팁을 보내 주셔서 감사합니다. 'print loc [1]'을 실행하면 좌표 정보가 출력됩니다. 코드를 다시 실행하면 컬렉션 전체를 다시 반복합니다. 나는'doc'가 스냅 샷이라는 것을 알고 있지만 필드 업데이트 방법을 모르겠습니다. – user94628

+0

아, 이제 이해합니다. '성장'은 문서의 실제 크기를 의미합니까? 그렇다면 업데이트 된 값을 수용하기 위해 다른 필드의 값을 'null'로 설정할 수 있습니까? – user94628

+1

@ user94628 문서의 내용을 넘어선 더 자세한 내용은 모르겠지만 문서의 크기에서 한 바이트 더 많은 공간을 차지한다는 의미로 '성장'한다고 가정합니다 (이동할 수 없기 때문에). 약). 매우 조심하면 다른 필드를 조작하여 전체 크기를 동일하게 유지할 수 있지만 지저분해질 수 있습니다. – JohnnyHK

관련 문제