2012-07-16 3 views
1

Mongo에는 SessionId 및 Ticks라는 두 개의 필드가있는 문서가 있습니다. SessionId는 키이고 Ticks는 특정 시점 이후부터 틱에 대해 긴 int입니다.세션 길이에 대한 몽고 쿼리

내가 원하는 것은 SessionId로 그룹화하고 해당 세션에 대한 최대 틱 수와 최소 틱 수를 비교하는 것입니다. SQL에서는 꽤 쉬울 것입니다 :

SELECT sessionId, MAX(ticks) - MIN(ticks) as session_length 
FROM weblog 
GROUP BY sessionId 

그러나 이것은 Mongo에서 상당히 관련이있는 MapReduce 인 것 같습니다. 어떻게할까요? MapReduce? JS for 루프? 나는 당신의 데이터 모델을 이해 가정

답변

1

, 당신은 그룹 명령을 사용할 수 있습니다

db.coll.group({ 
    key:{session:true}, 
    initial: {max: 0, min:100}, 
    reduce: function(obj, prev){ 
     if(obj.ticks > prev.max){ 
      prev.max=obj.ticks; 
     } 
     if(obj.ticks <prev.min){ 
      prev.min=obj.min; 
     } 
    }, 
    finalize: function(out){ 
     out.session_length=out.max - out.min; 
    } 
}) 

예를 입력 :

{ "_id" : 1, "session" : 1, "ticks" : 10 } 
{ "_id" : 2, "session" : 1, "ticks" : 4 } 
{ "_id" : 3, "session" : 1, "ticks" : 12 } 
{ "_id" : 4, "session" : 2, "ticks" : 6 } 
{ "_id" : 5, "session" : 2, "ticks" : 8 } 
{ "_id" : 6, "session" : 2, "ticks" : 3 } 

예 출력 :

[ 
    { 
     "session" : 1, 
     "max" : 12, 
     "min" : 4, 
     "session_length" : 8 
    }, 
    { 
     "session" : 2, 
     "max" : 8, 
     "min" : 3, 
     "session_length" : 5 
    } 
] 

http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

+1

에서 엠 ongoDB 버전 2.2 (다음 stable 릴리스)에서 새 집계 프레임 워크를 사용하면 Javascript없이이 유형의 집계를 수행 할 수 있습니다. 또한 쿼리 성능을 최대화하기 위해 세션 ID에 최소값과 최대 값을 저장하려고 할 수도 있습니다. 다음은 새로운 집계 프레임 워크에 대한 링크입니다. http://docs.mongodb.org/manual/applications/aggregation/ – Jenna