개발관련/MongoDB 2015. 11. 20. 13:49

자 이번엔 이전 쿼리에서 평균을 내어 보자. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
db.users.aggregate([
//stage 별로 나뉘며 앞에서 처리 된걸 가지고 다음 stage로 전달
    //stage 1
    {
        $match : {
            "index" :{
                $gte: 10000
            }
        }
    },
//stage2
    {
       $group:{
           "_id" :  "$eyeColor"
           "sum" : {
               $sum : 1
           }
       }
       
    },
//stage3
    {
       $group:{
           "_id" : "$_id",
           "avg" : {
               $avg : "$sum"
           }
       }
       
    }
    
]);   
 
cs


어라.. 먼가 바뀌었다. 위에 $group의 값을 보면 "$eyeColor"가 존재한다. 이 말은 users의 field에 eyeColor 라는넘을 사용하고 싶으면 위의 예시 처럼 사용하면 된다. 마지막 $group에 또 "$sum"이라는 넘이 나온다. 이 "$sum"이 앞서 있던 stage의 key였던 sum이 $sum으로 변경된 것이다. 


결론은 collection의 field 명 -> "$필드명" 이전 statge key 값 -> 다음 stage의 "$key" 로 사용 할 수 있다. 


근데 결과가 이전에 봤던거랑 같다. 이유는 $avg의 평균을 내면 그 값이 나오므로 ... 그럼 진짜 평균을 내보자. "각 eyeColor의 전체나이와 전체 나이의 평균" 을 내어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
db.users.aggregate([
//stage 별로 나뉘며 앞에서 처리 된걸 가지고 다음 stage로 전달
    //stage 1
    {
        $group : {
            "_id" : "$eyeColor" ,
            "ageSum" : {
                $sum : "$age" 
            },
            "ageCount" : {
                $sum : 1
            }
        }
    },
//stage2
    {
        $project : {
            //"_id" : 1,
            "ageAVG" : {
                $divide : ["$ageSum" ,"$ageCount"]
            }
            
        }
    }
    
]);   
cs


또 새로운게 등장 $project 이넘은 없는 필드를 만들거나 기존 필드를 안보이고 싶을때 사용 한다고 공식사이트에 명시 되있다. 위의 예제를 보면 각 stage별로 값들을 전달한 것들을 알 수있다. 


이걸로 aggregation은 끗.... 

posted by 제스트
: