mongoDB

[mongodb mapreduce] time grouping

고요한하늘... 2011. 6. 1. 16:20

time filed가

00:00:00시로 표현될때

첫번째 시간 필드만을 가지고

각 시간별 쿼리 카운트를 하고자 할때

아래와 같이 코드를 작성


m = function() {

      var tmp=this.time.split(":");

      emit(this.keyword, { times: tmp[0] });

};


r = function(key, values){

   var all = [];

   values.forEach(function(x){

     all.push(x.times)

   })

   return {"times": all.join(", ")};

}


f = function(key, values){

  var a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];


  var num = values.times.split(",");



  for(var i = 0; i < num.length; i++ )

  {

   index = parseInt(num[i]);

   if( 0 <= index && index <= 23 )

   {

      a[index] += 1;

   }

            else

            {

      a[24] += 1;

            }

  }


  return { hour: a};

}



db.query.mapReduce(m,r,  {out:"test_mr", finalize:f} )


-----------------------------------------------------------------------

위 코드는 작은 컬렉션에서는 가능하지만 큰 컬렉션에서는 메모리부족으로 동작하지 않는다


m = function() {

        var a=[]

try{

            var tmp=this.time.split(":");

            a[0]=parseInt(tmp[0], 10 );

            emit(this.keyword, { times : a });


        }catch( err ){

            a[0]=24;

            emit(this.keyword, { times: a });

        }

};


r = function(key, values){

   var index=0;

   var a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];

    values.forEach(function(x){

     try{

        for ( var i = 0; i < x.times.length; i++ )

        {

             index = parseInt(x.times[i], 10 );

             if( isNaN( index ) )

             { 

                  a[ 24 ]++;

             }

             else

             {

                   if( 0 <= index && index <= 23 )

                   {

                         a[ index ]++;

                   }


             }

        }

     }catch(err){

     a[ 24 ]++;

     }

   })

   return { "times": a };

};


db.test1.mapReduce(m,r,  {out:"mr"} )


※ map에 의해서 처리된 결과가 한번의 reduce 과정만을 거친후 바로 데이터가 만들어지는것이 아니것 같다.

그렇기 때문에

reduce의 입,출력이 동일한 형태여야 한다.

위의 경우를 예를 든다면

reduce의 return value가 a라는 배열이기 때문에 입력 역시 배열이어야 한다.

reduce의 입력이 배열이 될려면 결과적으로 map함수의 출력이 배열이 되어야 함을 의미한다.


'mongoDB' 카테고리의 다른 글

[mongodb] case study2  (0) 2011.08.17
mongodb test  (0) 2011.06.22
[mongodb mapreduce] add integer value  (0) 2011.04.08
[mongodb mapreduce] string concatenate  (0) 2011.04.08
[mongodb] case study1  (0) 2011.03.22