2011-08-09 5 views
5

문서는이MongoDB에서 필드를 변경하거나 빠르게 업데이트하는 방법은 무엇입니까?

{title:"here", lat:123.4512, lng:36.3423, time:"2011-01-02"} 

내가이

{title:"here", {latlng: {lat:123.4512, lng:36.3423}}, time:"2011-01-02"} 

같은 chane 문서 그래서 내가 MongoDB를 콘솔에서이 작업을 시도 할 것이다하고자합니다.

db.coll.find().forEach(function(u){ 
    u.latlng = {"lat":u.lat, "lng":u.lng}; 
    db.coll.save(u); 
    db.coll.update(u, {$unset:{"map_x1":1, "map_y1":1}}); 
}) 

하지만 매우 느리게 T.T

의 내가 다른 솔루션을

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

생각하지만 난 그것을 실행할 수 없습니다. 첫 번째 솔루션이 아직 실행 중이므로 ...

이 직업과 같은 빠른 해결책이 있습니까?

답변

10

두 번째 쿼리는 전체 문서를 사용 $ 세트를 덮어 쓸 것이기 때문에 분류됩니다

db.coll.find().forEach(function(u){ 
    db.coll.update(u, {$set:{"latlng" : {"lat":u.lat, "lng":u.lng}}, $unset:{"lat":1, "lng":1}}); 
}) 

원래 시도가 있기 때문에 동일한을 업데이트하고로이 두 배 이상 빠른 속도로 수 있습니다 문서는 두 번 필요하지는 않습니다.

+0

몽고는 어떻게 그러한 명령을 처리합니까? 나는 일종의 게으른 평가를하고 컬렉션의 한 스캔으로 문서를 업데이트한다고 생각하니? 또는 문서를 다시 검색 한 다음 업데이트해야합니까? 두 번째 방법은 전체 컬렉션을 업데이트하기 위해 0 (n^2)의 복잡성이 필요하므로 어떤 일이 발생하지 않기를 바랍니다. 그러나 이에 관한 공식 문서가 있습니까? – Savvas

관련 문제