개발관련/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은 끗....