본문 바로가기

저장된 데이터를 특정한 필드 값으로 그룹을 묶고 싶을때가 있다. 

같은 값을 가진 문서가 몇개인지 궁금할 때가 가장 단순한 예가 되겠다.

 

이런 경우 aggregate 함수를 활용하면 된다.

몽고db 매뉴얼 페이지에서 해당 내용을 가져와 보자.

 

https://docs.mongodb.com/manual/reference/operator/aggregation/sum/

 

Grouping the documents by the day and the year of the date field, the following operation uses the $sum accumulator to compute the total amount and the count for each group of documents.

db.sales.aggregate(
   [
     {
       $group:
         {
           _id: { day: { $dayOfYear: "$date"}, year: { $year: "$date" } },
           totalAmount: { $sum: { $multiply: [ "$price", "$quantity" ] } },
           count: { $sum: 1 }
         }
     }
   ]
)

The operation returns the following results:

{ "_id" : { "day" : 46, "year" : 2014 }, "totalAmount" : 150, "count" : 2 }
{ "_id" : { "day" : 34, "year" : 2014 }, "totalAmount" : 45, "count" : 2 }
{ "_id" : { "day" : 1, "year" : 2014 }, "totalAmount" : 20, "count" : 1 }

예로 든 내용을 간단히 짚어 보면,

db.sales 테이블(컬렉션)에서 동일 날짜에 있는 레코드(문서)를 aggregate 함수로 그룹을 만드는 것이다.

 

$group: 안에 보면 

_id: 로 되어 있는 부분이 묶는 기준인듯 하다. day, year 가 같은 놈들끼리 묶어라

그 이후는 그룹된 레코들의 값들을 조합해서 원하는 값을 구해오는 과정이다.

totalAmount : 는 묶어서 총 판매 금액을 구하는 것이고

count: 는 그룹으로 묶인 레코드(문서) 의 개수를 출력하도록 하는 것이다.

 

이로서, 

db.sales 값이 동일 날짜로 묶어져서 아래 결과처럼 컬렉션이 나오는 것을 확인할 수 있다.

 

그럼 Mongoengine 에서는 그대로 쓸수 있나?

 

나는 이렇게 하니깐 되긴 하더라

groupstring = [ { '$group' : {  '_id' : '$box', 'count' : { '$sum': 1 } } } ]
result_box_list = Result.objects().aggregate(groupstring)

 

원리를 알면, 응용은 각자의 몫인듯~~

BJ.

레코드 콜렉션, 예전 주인들은 어떻게 그룹핑을 했을까?

Lopsan 님의 사진, 출처: Pexels

B로그0간

개발 관련 글과 유용한 정보를 공유하는 공간입니다.