일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- sourcetree
- Reset
- git branch
- linux
- fixed
- Express
- css
- git
- Remote
- crud
- React
- Box Model
- WEB
- Merge
- workflow
- Rebase
- Develop
- Process
- Teamwork
- route
- rbenv
- git checkout
- Basic
- root
- Advanced
- 소스트리
- Nodejs
- commit
- relative
- html
- Today
- Total
Codesigner
[MongoDB] MongoDB Aggregation 본문
MongoDB Aggregation은 여러 document들을 grouping하여 연산을 수행한 후 하나의 result를 반환하는 연산이다. MongoDB는 다음과 같은 세가지 방법의 Aggregation을 제공한다
1. Aggregation Pipeline
2. Map-Reduce function
3. single purpose aggregation method
처음부터 차근차근 살펴보도록 하자
Aggregation pipeline
MongoDB의 Aggregation framework는 data processing pipeline에 기반하여 모델링 되었다. Linux의 | 연산처럼 파이프라이닝 한다고 이해하면 된다. document들이 여러 단계의 pipeline을 거쳐 하나의 aggregationed result가 만들어진다
가장 기본적인 파이프라인 단계는 filter로, document들을 query한 후 특정 필드를 기준으로 grouping하거나 sorting 하는 것이다. 각 파이프라인 단계에서 operater를 활용하여 평균값 계산이나 스트링 연결과 같은 연산을 수행할 수 있다
위 사진은 Aggregation pipeline의 예시를 보여준 것이다. 차근차근 살펴보도록 하자
먼저, $match 연산자로 status가 'A' 인 document들을 filtering하였다. 그런 다음 $group 연산자로 그룹핑할 document를 정의하였는데, _id 필드는 "$cust_id"로 filtering된 document들 중에서 cust_id필드가 같은 document들을 그룹핑 하였고, total 필드는 그룹핑 한 document들의 amout필드의 합으로 주어졌다. 즉, cust_id가 "A123", "B212"인 것들로 묶이고, 그 안에서 amount가 합해진 결과가 반환된다.
Map-Reduce function
Map-Reduce function은 두 가지 단계로 구성되는데, map단계에서 주어진 각 document를 프로세싱 하고, reduce 단계에서 map연산의 결과를 combine한다. 또한 부가적으로 finalize단계가 존재하는데, 마지막으로 result를 modification하는 단계이다. 다른 aggregation과 마찬가지로, document들을 filtering하여 선택적으로 input document를 줄 수 있다
Map-Reduce function은 사용자가 정의한 Javascript 함수를 사용할 수 있기 때문에 Aggregation pipeline보다 더 유연한 반면 보다 덜 효율적이고 복잡하다
위 사진은 Map-Reduce function을 활용한 aggregation 예제이다. 차근차근 살펴보도록 하자.
mapReduce안에 먼저 query 필드가 주어졌는데, status가 "A" 인 document들을 filtering한다. 그 다음 map단계에서 cust_id가 같은 것들끼리 묶이고, 같은 cust_id 별로 amount가 추가된다. 다음은 reduce단계로 map연산의 결과의 각 document의 추가된 amout들을 합치는 연산을 수행한다. 마지막으로 out 필드의 값인 order_totals 라는 이름으로 aggregated result 가 반환된다
Single Purpose Aggregation Operations
MongoDB는 db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 와 같은 메서드를 제공하는데, 이는 하나의 collection에서 aggregation하는 것으로 간단한 반면 aggregation pipeline이나 map-reduce function보다는 성능이다 유연성 측면에서 뒤떨어진다.
위 사진은 Single Purpose Aggregation Operation을 설명한 사진이다. 위에서 제시한 두 가지 방법보다 확실히 이해가 쉽지만, 강력한 연산 기능은 제공하지 않다는 걸 알 수 있다.
지금까지 MongoDB에서 제공하는 Aggregation의 정의와 세 가지 방법들 그리고 각 방법에 대해 간단히 알아보았다. 세 가지 방법에 대해서 MongoDB Manual 에서 제공하는 더 자세한 정보를 알고 싶다면 Aggregation Commands Comparison 를 참고하기 바란다. 또한, 이 글에 대해서 자유롭게 피드백을 준다면 적극 수용하겠습니다.
출처: MongoDB Manual