2014-06-10 2 views
0

1 백만 개의 문서가있는 모음집이 있습니다. 각 문서에는 ip 필드가 있습니다. IP를 매개 변수로 전달하여 국가 코드를 반환 할 수있는 노드 함수가 있습니다. 모든 레코드를 가져오고, 노드 기능을 실행하고, 반환 된 국가 이름을 문서에 다시 삽입하려고했습니다. 한 번에 업데이트하십시오. 그러나 mongodb에는 16M 데이터가 제한되어 있습니다.mongodb 업데이트 1 백만 레코드

하기 전에

{ 
    _id: xxxxx, 
    ip: '207.97.227.239' 
} 

{ 
    _id: xxxxx, 
    ip: '207.97.227.239', 
    country_abbr: 'US' 
} 

후 내 질문에 내가 안전하고 신속하게이 100 만 개 레코드를 업데이트 할 수있는 방법입니다.

답변

1

난 당신이 ip의 값에 따라 country_abbr 필드를 설정하는 것으로 가정하고있다. 그래서 나는 ip을 확인하고 country_abbr의 값을 설정하는 업데이트 명령이 필요할 것이라고 생각합니다. 이것은 당신이 그것을 할 방법입니다 :

db.collection.update (
    {ip : condition_for_ip}, 
    {$set : {country_abbr : desired_value}}, 
    {multi : true} 
); 

당신은 당신의 컬렉션에서이 쿼리를 가능한 모든 국가를 충당하기 위해 여러 번 실행해야합니다. 위의 기록 찾기 쿼리가 문서를 반환하는 경우

db.collection.find({'country_abbr' : {$exists : false}}); 

, 당신은 ip을 읽을 수 있습니다 country_abbr 위해 값없이 컬렉션에 남아있는 일부 문서가있을 경우

는 다음 쿼리를 실행할 수 확인하려면 추가 할 국가가 더 많은지 확인하십시오. 설명 후

편집 :

복귀하는 문서가 너무 큽니다하고 경우에 16 메가 바이트 제한을 교차. 따라서 당신은 오직 ip만을 가져 와서 링크 된 목록에 모두 저장한다는 것입니다. 그런 다음 목록을 반복하고 마술적인 node 함수를 사용하면 올바른 country_abbr 값을 얻습니다. 마지막으로 위에서 작성한 방법으로 mongo에 간단한 업데이트를 발행합니다.

누구나 내 대답을 일반화하려면이 질문을 한 사람의 기능 대신 수동 입력 또는 원하는대로 무엇이든 할 수 있고 위의 업데이트 명령에 country_abbr 값을 제공 할 수 있습니다.

+0

을 업데이트하기 위해서는 먼저 날짜를 얻어야합니다. 기본적으로 ip에 기반한 국가 이름을 반환하는 노드 함수가 있습니다. 모든 레코드를 가져 와서 각 레코드를 반복하고 반환 국가 이름을 다시 문서에 삽입하려고 생각했습니다. 그러나 mongodb는 16M 데이터 만 반환합니다. 그게 해결할 문제 – eded

+0

입니다. 시도해 볼 수 있습니다 – eded

+0

@eded 그것이 효과가 있습니까? – well

0

업데이트 방법을 사용해 보셨습니까? http://docs.mongodb.org/manual/reference/method/db.collection.update/

+0

실제로 업데이트 방법을 사용하면 업데이트를 수행하기 위해 먼저 모든 데이터를 가져와야합니다. 맞습니까? 하지만 몽고는 오직 16M 만 돌려줍니다. – eded

+0

또한 나라 이름을 얻기 위해 기존의 ip를 사용하고 나서 문서 – eded

관련 문제