저장된 데이터를 특정한 필드 값으로 그룹을 묶고 싶을때가 있다.
같은 값을 가진 문서가 몇개인지 궁금할 때가 가장 단순한 예가 되겠다.
이런 경우 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.
'IT > DB' 카테고리의 다른 글
MongoDB 연결된 상태 보기 (0) | 2021.07.01 |
---|---|
Flask MongoEngine 쿼리 filter() 함수 문자열 - Query Operators (0) | 2021.06.21 |
mongodb - Flask mongoengine 필드로 정렬하는 방법 (0) | 2021.06.15 |
mongodb - Flask mongoengine을 이용하여 필드 추가, 삭제 (0) | 2021.06.11 |
Flask mongoengine Objects() 와 Objects.get() 차이점 (0) | 2021.06.09 |