MongoDB Aggregation

ImOk·2022년 1월 16일
0

MongoDB

목록 보기
1/3
post-thumbnail

MongoDB Aggregation

  • MongoDB Aggregation은 여러 document들을 grouping하여 연산을 수행한 후 하나의 result를 반환하는 연산이다.
  • mapreduce는 통계의 추이를 뽑고 싶을 때 사용되며 aggregation은 양이 적고, 휘발성인 통계를 뽑을 때 사용하면 좋다.
  • 기존의 find로는 원하는 데이터로 가공하는데 어려움이 많이 있다. 따라서 aggregate를 이용하면 해결할 수 있다.
  • Aggregation은 각각의 operation들이 ,로 구분되어 리스트 형식으로 들어간다.
db.orders.aggregate( [
   { $match: { status: "urgent" } },
   { $group: { _id: "$productName", sumQuantity: { $sum: "$quantity" } } }
] )

RDMS vs Aggregation

RDMSAggregation
select$project
fromdb.[collectionName].aggregate(. . .)
where$match
group by$group
having$match
order by$sort
limit$limit
sum()$sum
count()$sum
join$unwind

1. Aggregation Pipeline

  • 이전 단계의 연산 결과를 다음 단계 연산에 이용하는 것을 의미 함.
  • 사용법 : db.[collectionName].aggregate([{$match: ...}, {$group: ...}, {$sort: ...}])
Aggregationdescription
$project전체 도큐먼트에서 필요한 필드만 뽑아서 다음 스테이지로 전달
$match처리될 도큐먼트를 선택하는 것. find()와 비슷한 역할을 수행
$limit다음 단계에 전달될 도큐먼트의 수를 제한
$skip지정된 수의 도큐먼트를 건너뜀
$unwind배열을 확장하여 각 배열 항목에 대해 하나의 출력 도큐먼트를 생성
$group지정된 키로 도큐먼트를 그룹화
$sort도큐먼트를 정렬
$geoNear지리 공간위치 근처의 도큐먼트를 선택
$out파이프라인의 결과(출력)를 컬렉션에 씀
$redact특정 데이터에 대한 접근을 제어

1-1. $group

함수description
$addToSet그룹에 고유한 값의 배열을 만든다
$first그룹의 첫 번째 값. $sort를 선행해야만 의미가 있다.
$last그룹의 마지막 값. $sort를 선행해야만 의미가 있다.
$max그룹의 필드 최댓값
$min그룹의 필드 최솟값
$avg필드의 평균값
$sum그룹의 모든 값의 배열을 반환한다. 중복값을 제거하지 않는다.
$sum그룹의 모든 값의 합계

2. Map-Reduce function

  • 맵(Map)을 산출하는 함수 + 간추리는(Reduce) 함수.
  • 구글에서 대용량 Data에 대한 Batch Processing 및 Aggregation 을 위해 만들어졌다.
  • 공유되지 않은 여러 Node에서 동시에 병렬 처리 방식으로 Big Data에 대한 처리가 가능한 기능.
  • 개발자가 Programming으로 함수를 생성하게 해주는 기능.
  • 사용법: db.[collectionName].mapReduce(map,reduce, { <options> })

옵션description
out맵리듀스 명령의 결과를 저장하거나 출력할 위치를 명시
out 인자에는 문자열 또는 도큐먼트를 설정할 수 있다.
query맵리듀스 명령을 실행할 대상 문서를 검색하는 조건을 명시
query 옵션에는 일반적인 find 명령의 검색 조건과 동일한 오퍼레이터를 활용할 수 있다.
sort맵리듀스 명령을 실행할 대상 문서를 먼저 정렬해서 맵리듀스 엔진으로 전달하고자 할 때 사용
맵리듀스 엔진은 key 필드의 값으로 정렬을 수행하는데, sort 옵션을 사용하여 인덱스를 활용한 정렬을 수행할 수 있다면 맵리듀스 엔진의 정렬에 드는 부하를 줄일 수 있다.
limit맵리듀스 엔진으로 전달할 문서의 개수를 설정
finalize대게 맵리듀스는 map과 reduce 함수로 이루어지는데, reduce함수의 결과를 다시 한번 가공해 최종결과를 만들고 싶을 때 사용
scopemap과 reduce 함수 그리고 finalize 함수에서 접근할 수 있는 글로벌 변수를 정의
보통은 map&reduce에는 인자로 전달된 값만 이용할 수 있으므로 모든 문서가 공유할 변수값등이 필요하면 scope를 이용하면 된다.
jsMode몽고디비 맵리듀스 엔진은 map이나 reduce 함수로 전달되는 문서를 계속해서 몽고디비서버와 자바스크립트 엔진 사이에서 변환 작업을 함
jsMode를 true로 설정하면 중간 과정의 데이터를 메모리에 모두 보관한다.
더 빠른 처리가 가능하지만 그만큼 메모리를 많이 먹는 작업이다.
처리하는 문서가 50만건을 초과하면 jsMode를 true로 설정할 수 없다. jsMode는 기본값이 false이다.
verbose맵리듀스의 처리 결과에 단계별 처리 과정 및 소요 시간에 대한 정보를 포함할 것인지 결정
기본값은 true이다.

2.1 Map-Reduce vs Aggregate

기능Map-ReduceAggregate
대상 데이터비정형, 반정형, 정형 모두 가능정형, 반정형만 처리 가능
작성방식JS 함수 코딩Stage(Pipeline) 과 Expression 조합
실행환경JS 런타임Native
실행결과1.Out Collection(집계결과를 다른 collection에 저장)
2.Document
1.Cursor
2.Out Collection
작업방식주로 Batch Job실시간 처리, Batch Job 모두 처리 가능
분산집계
(shard 환경, multi node)
지원지원
속도느림몇몇 경우 제외하고 더 빠름

3. single purpose aggregation method

  • db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 와 같은 메서드를 제공
  • aggregation pipeline이나 map-reduce function보다는 성능이나 유연성 측면에서 뒤떨어진다.

🔗 참고 사이트

https://spidyweb.tistory.com/190
https://coding-start.tistory.com/293
https://docs.mongodb.com/manual/aggregation/

profile
ImOk👌

0개의 댓글