2012-11-16 2 views
1

mongodb 데이터베이스에서 몇 주 동안 약 10 개의 mio 문서를 수집했으며 몇 가지 간단한 통계를 계산하여 출력 할 수 있기를 원합니다. 내가 얻으려고하는 통계는 시간 간격 내에서 각 문서의 등급 평균을 1 시간 간격으로 나타냅니다. mongodb로 시간별 통계 검색 최적화

내가 할 노력하고있어의 아이디어를 제공하기 위해이 sudo는 규정을 따르

var dateTimeStart; 
var dateTimeEnd; 

var distinctHoursBetweenDateTimes = getHours(dateTimeStart, dateTimeEnd); 

var totalResult=[]; 

foreach(distinctHour in distinctHoursBetweenDateTimes) 
    tmpResult = mapreduce_getAverageRating(distinctHour, distinctHour +1) 
    totalResult[distinctHour] = tmpResult; 

return totalResult; 

내 문서 구조는 다음과 같은 : {_id, 평가, 주제, created_at}

Created_at는 내가 삽입 한 통계를 수집하는 날짜입니다 (삽입 시간과 생성 시간이 항상 같지는 않습니다)

created_at 필드에 색인을 생성했습니다. 아마도 몽고 더 많은 일을시키는 대신의 행에 여러 맵리 듀스 문을 실행하여 -이보다 효과적으로 수행 할 수 있습니다 확신

map = function(){ 
    emit(this.Topic , { 'total' : this.Rating , num : 1 }); 
}; 

reduce = function (key, values){ 
    var n = {'total' : 0, num : 0}; 
    for (var i=0; i<values.length; i++){ 
     n.total += values[i].total; 
     n.num += values[i].num; 
    } 
    return n; 
}; 

finalize = function(key, res){ 
    res.avg = res.total/res.num; 
    return res; 
}; 

:

다음

내 맵리 듀스이다.

이 시점에서 각 map-reduce에는 약 20-25 초가 걸리므로 며칠 동안의 모든 시간에 대한 통계 계산이 갑자기 매우 오랜 시간이 걸립니다.

내 생각에 몽고는 이러한 종류의 작업에 적합해야한다는 것이 분명하므로 분명히 잘못된 것을해야합니다.

도움 주셔서 감사합니다.

답변

1

그리고 내가 MapReducing하는 문서의 일부라고 생각하십니까?

모든 문서에서 MapReduce를 실행할 때지도 기능에서 시간을 결정하고 방출하는 키에 시간을 추가하면이 모든 것을 단일 MapReduce에서 수행 할 수 있습니다.

+0

제대로 이해하지 못했을 수도 있습니다. 아마도 당신도 알 수 있듯이 MapReduce에 대해 배우고 있습니다. 지도 기능에서 제공되는 키와 값을 기반으로 - 시간을 어떻게 알 수 있습니까? reduce 함수에서 key (topic, hour), value (rating)와 같은 것을 반환해야합니까? 아마도 개념적 예를 들어 나를 도울 수있는 기회가 있습니까? – klausk

+1

'키 (주제, 시간), 값 (등급, 수) '이 좋게 들립니다. * 주제 및 시간 *마다 * 평균 등급 *을 원합니다. finalize 함수를 사용하여 최종 객체에 키를 추가 할 수도 있습니다 (현재 num, total 및 average 필드로 구성되어 있지만 컨텍스트는없는 객체 만 생성합니다). – Philipp

+0

답변을 다시 읽으면서 내가하고 싶은 일에 대해 생각해 봤습니다. 내 맵 함수에서 this와 같은 "natural"키를 사용하는 대신 키를 "작성"해야합니다. 좀 더 구체적으로 말하자면, this.created_at에서 시간 정보를 추출하고 주제와 키를 결합해야합니다. 이것은 정확하게 이해되고 있습니까? – klausk