2012-07-05 2 views
0

MongoDB를 사용하여 컬렉션에서 각각의 고유 한 "concatenated_handles"(유형 문자열이있는 필드)의 발생 횟수를 계산하려고했습니다.MongoDB MapReduce가 예기치 않은 결과를 반환하고 두 번 그룹화합니다.

또한 일종의 사건의 수에 따라 할 수 있었다, 그래서 나는 맵리 듀스를 사용하기로 결정, 모든 좋은 거라고하지만 갑자기 예기치 않은 결과를 받기 시작하고 나는이 내지도입니다

어떠한 코드를 변경하지 :

function() { emit(this.concatenated_handles, { count: 1}); } 

은입니다 감소 : 일부 필드에 대한 정확한 값을 반환

r = function(key, values) { var result = {count : 0}; values.forEach(function(value) { result.count++; }); return result; } 

그것을 다른 사람 동안 잘못된. I 출력을 기록하고, 여기가

msdhoni#yuvstrong12:0 
    msdhoni#yuvstrong12:1 
    msdhoni#yuvstrong12:2 
    .... 
    ... 
    msdhoni#yuvstrong12:255 
    msdhoni#yuvstrong12:256 
    musclenerd#pod2g:0 
    musclenerd#pod2g:1 

이 필드는 (모든 재 그룹은 끝으로 있습니다)

justinbieber#pattiemallette:0 
justinbieber#pattiemallette:1 
justinbieber#pattiemallette:2 
justinbieber#pattiemallette:3 
justinbieber#scooterbraun:0 
justinbieber#scooterbraun:1 
justinbieber#scooterbraun:2 
kaleycuoco#kunalnayyar:0 
kaleycuoco#kunalnayyar:1 
kaleycuoco#kunalnayyar:2 
kaleycuoco#kunalnayyar:3 
kaleycuoco#kunalnayyar:4 
kaleycuoco#kunalnayyar:5 
msdhoni#yuvstrong12:0 
msdhoni#yuvstrong12:1 
msdhoni#yuvstrong12:2 
몇 가지 다른 행 다음에 다시 그룹화 시작 (만 도청 된 필드를 표시)입니다

위의 모든 입력란은 마지막에 REGROUPED됩니다. 그들은 같은 것처럼 보이지만 두 번 그룹화하여 예기치 않은 결과를 얻었습니다. 그리고 이것은 모든 기록에서 일어나는 것은 아닙니다.

어디로 잘못 가고 있습니까? 그룹 필드는 문자열입니다.

감사합니다.

답변

0

좋습니다, MongoDB는 MapReduce를 재귀 적으로 또는 부분적으로 호출 할 수 있습니다. 따라서 reduce 함수는 멱등수 여야합니다.

값지도의 구조가 표시되고 값 축소 구조가 반환되기 때문에 내 축소 기능의 멱등 원이라고해도됩니다. 그러나 주목해야 할 중요한 사항 중 하나는 다음과 같습니다. - 호출이 반복적으로 수행 될 때마다 첫 번째 호출의 결과가 두 번째 호출의 입력으로 전달됩니다. 내 경우에 따라서

이 감소 :

r = function(key, values) { var result = {count : 0}; values.forEach(function(value) { result.count++; }); return result; } 

같은 키에 대한 모든 후속 호출은 0 증가를 시작으로 이전 반복에서 전달 된 수를 추가하는 일을 대신 추가합니다 value.count

그래서 대신

result.count++; 

을하고 난

,617을하고있다한다
result.count += value.count; 

모든 통화가 이전 통화까지 카운트를 사용합니다. 내가 올바르게 설명하면

나는 확실하지 않다, 그러나 잘 (추가 기술 설명에서) 여기에 설명되어 있습니다 :

http://www.mongodb.org/display/DOCS/MapReduce

관련 문제