2011-12-04 2 views
0

내가 모든 판매를 포함하고 국가에 의해,이MongoDB의 복잡한지도/감소 - 또는 그래서 나는 마지막에,

{_id: '999', buyer:{city:'Dallas','state':'Texas',...}, products: {...}, order_value:1000, date:"2011-11-23T11:34:33Z" } 내가 주문 볼륨에 대한 통계를 보여줄 필요가

처럼 보이는 MongoDB를 수집 있다고 생각 30, 60 및 90 일. 그래서, 당신은 하나의 쿼리에서이 작업을 수행 할 방법이

 
State   Last 30  Last 60  Last 90 
Arizona  12000   22000  35000 
Texas   5000   9000  16000 

뭔가를 얻으려면?

map = function() { 
    emit({key : this.buyer.state, value : order_value}) 
} 

reduce = function(key,values) { 
    sum = 0; 
    values.forEach(function(o) { 
     sum += o 
     } 
    return sum 
    } 

한 다음 쿼리 {날짜 컬렉션을 줄일지도 : {$에있다 : {[오늘 마이너스 삼십일]}} (I 디부 ONT 구문을 기억 매우 어렵지 않다

답변

0

하지만 mongodb 사이트의 훌륭한 mapreduce 문서를 봐야합니다.)

맵 축소를보다 효율적으로 사용하려면 지난 30 일간 처음으로 쿼리하여 incremental map reduce으로 생각한 다음 reduce (증분) 필터링을 -60 일에서 -30 일간 매핑하여 l60 일에 대한 정보를 얻으십시오. 마지막으로 증분 맵을 실행하여 지난 90 일간의 필터링을 -60 일에서 -90 일간 줄입니다. 당신이 3 queryies을 가지고 있지만 당신은 단지 당신이 아직없는 데이터에 대한 집계를 다시 계산하기 때문에

이 나쁘지 않다.

나는 예를 제공 할 수 있습니다,하지만 지금은 스스로 그것을 할 수 있어야합니다.

+0

좋아하지만, 한 쿼리에서 30, 60, 90, 모두를 얻는 방법? –

+0

@CatalinM 더 복잡하지만 불가능하지는 않습니다. 더 복잡한 reduce 함수를 만들어야합니다 (그리고 날짜 값을 포함하여 더 복잡한 키를지도에서 사용해야합니다). 그러나 나는 3지도 감축을 실행하는 것이 좋습니다. 하나의 쿼리를 실행할 어떤 이유가 있습니까? – kamaradclimber

+0

성능이 오케이 쿼리를 원한다면 @CatalinM : 하나의 쿼리에서 수행 할 수있는 유일한 해결책은 매우 javascript 스타일이며 매우 느립니다 (적어도 3 개 맵을 줄이는 것보다 훨씬 많은 작업). 또한 점진적인지도 축소를 할 수 있다고 생각하고 업데이트 된 답변을 참조하십시오. – kamaradclimber