find
로는 원하는 데이터로 가공하는데 어려움이 많이 있다. 따라서 aggregate를 이용하면 해결할 수 있다.,
로 구분되어 리스트 형식으로 들어간다.db.orders.aggregate( [
{ $match: { status: "urgent" } },
{ $group: { _id: "$productName", sumQuantity: { $sum: "$quantity" } } }
] )
RDMS | Aggregation |
---|---|
select | $project |
from | db.[collectionName].aggregate(. . .) |
where | $match |
group by | $group |
having | $match |
order by | $sort |
limit | $limit |
sum() | $sum |
count() | $sum |
join | $unwind |
Aggregation | description |
---|---|
$project | 전체 도큐먼트에서 필요한 필드만 뽑아서 다음 스테이지로 전달 |
$match | 처리될 도큐먼트를 선택하는 것. find()와 비슷한 역할을 수행 |
$limit | 다음 단계에 전달될 도큐먼트의 수를 제한 |
$skip | 지정된 수의 도큐먼트를 건너뜀 |
$unwind | 배열을 확장하여 각 배열 항목에 대해 하나의 출력 도큐먼트를 생성 |
$group | 지정된 키로 도큐먼트를 그룹화 |
$sort | 도큐먼트를 정렬 |
$geoNear | 지리 공간위치 근처의 도큐먼트를 선택 |
$out | 파이프라인의 결과(출력)를 컬렉션에 씀 |
$redact | 특정 데이터에 대한 접근을 제어 |
함수 | description |
---|---|
$addToSet | 그룹에 고유한 값의 배열을 만든다 |
$first | 그룹의 첫 번째 값. $sort를 선행해야만 의미가 있다. |
$last | 그룹의 마지막 값. $sort를 선행해야만 의미가 있다. |
$max | 그룹의 필드 최댓값 |
$min | 그룹의 필드 최솟값 |
$avg | 필드의 평균값 |
$sum | 그룹의 모든 값의 배열을 반환한다. 중복값을 제거하지 않는다. |
$sum | 그룹의 모든 값의 합계 |
옵션 | description |
---|---|
out | 맵리듀스 명령의 결과를 저장하거나 출력할 위치를 명시 out 인자에는 문자열 또는 도큐먼트를 설정할 수 있다. |
query | 맵리듀스 명령을 실행할 대상 문서를 검색하는 조건을 명시 query 옵션에는 일반적인 find 명령의 검색 조건과 동일한 오퍼레이터를 활용할 수 있다. |
sort | 맵리듀스 명령을 실행할 대상 문서를 먼저 정렬해서 맵리듀스 엔진으로 전달하고자 할 때 사용 맵리듀스 엔진은 key 필드의 값으로 정렬을 수행하는데, sort 옵션을 사용하여 인덱스를 활용한 정렬을 수행할 수 있다면 맵리듀스 엔진의 정렬에 드는 부하를 줄일 수 있다. |
limit | 맵리듀스 엔진으로 전달할 문서의 개수를 설정 |
finalize | 대게 맵리듀스는 map과 reduce 함수로 이루어지는데, reduce함수의 결과를 다시 한번 가공해 최종결과를 만들고 싶을 때 사용 |
scope | map과 reduce 함수 그리고 finalize 함수에서 접근할 수 있는 글로벌 변수를 정의 보통은 map&reduce에는 인자로 전달된 값만 이용할 수 있으므로 모든 문서가 공유할 변수값등이 필요하면 scope를 이용하면 된다. |
jsMode | 몽고디비 맵리듀스 엔진은 map이나 reduce 함수로 전달되는 문서를 계속해서 몽고디비서버와 자바스크립트 엔진 사이에서 변환 작업을 함 jsMode를 true로 설정하면 중간 과정의 데이터를 메모리에 모두 보관한다. 더 빠른 처리가 가능하지만 그만큼 메모리를 많이 먹는 작업이다. 처리하는 문서가 50만건을 초과하면 jsMode를 true로 설정할 수 없다. jsMode는 기본값이 false이다. |
verbose | 맵리듀스의 처리 결과에 단계별 처리 과정 및 소요 시간에 대한 정보를 포함할 것인지 결정 기본값은 true이다. |
기능 | Map-Reduce | Aggregate |
---|---|---|
대상 데이터 | 비정형, 반정형, 정형 모두 가능 | 정형, 반정형만 처리 가능 |
작성방식 | JS 함수 코딩 | Stage(Pipeline) 과 Expression 조합 |
실행환경 | JS 런타임 | Native |
실행결과 | 1.Out Collection(집계결과를 다른 collection에 저장) 2.Document | 1.Cursor 2.Out Collection |
작업방식 | 주로 Batch Job | 실시간 처리, Batch Job 모두 처리 가능 |
분산집계 (shard 환경, multi node) | 지원 | 지원 |
속도 | 느림 | 몇몇 경우 제외하고 더 빠름 |
db.collection.estimatedDocumentCount()
, db.collection.count()
, db.collection.distinct()
와 같은 메서드를 제공https://spidyweb.tistory.com/190
https://coding-start.tistory.com/293
https://docs.mongodb.com/manual/aggregation/