Codesigner

[MongoDB] MongoDB Aggregation 본문

DB/MongoDB

[MongoDB] MongoDB Aggregation

eunsukimme 2019. 3. 31. 21:26

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를 활용하여 평균값 계산이나 스트링 연결과 같은 연산을 수행할 수 있다

 

<그림 1> Aggregation Pipeline

위 사진은 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보다 더 유연한 반면 보다 덜 효율적이고 복잡하다

 

<그림 2> Map-Reduce function

위 사진은 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보다는 성능이다 유연성 측면에서 뒤떨어진다.

 

 

<그림 3> Single Purpose Aggregation Operation

위 사진은 Single Purpose Aggregation Operation을 설명한 사진이다. 위에서 제시한 두 가지 방법보다 확실히 이해가 쉽지만, 강력한 연산 기능은 제공하지 않다는 걸 알 수 있다. 

 

지금까지 MongoDB에서 제공하는 Aggregation의 정의와 세 가지 방법들 그리고 각 방법에 대해 간단히 알아보았다. 세 가지 방법에 대해서 MongoDB Manual 에서 제공하는 더 자세한 정보를 알고 싶다면 Aggregation Commands Comparison 를 참고하기 바란다. 또한, 이 글에 대해서 자유롭게 피드백을 준다면 적극 수용하겠습니다.

 

출처: MongoDB Manual

Comments