보관함

MongoDB 집계(aggregation) 정리 – count, distinct, $group, 파이프라인

예전 MongoDB 자료에 나오는 group(), db.eval(), mapReduce 는 지금 버전에서 없어졌거나 쓰지 않는다. 지금 쓰는 방식 기준으로 정리했다.

1. 개수 세기

예전의 db.collection.count() 와 cursor.count() 는 deprecated 다.

2. 중복 없는 값 (distinct)

3. 집계 파이프라인

문서가 단계(stage)를 차례로 통과하며 걸러지고 바뀌는 구조다. 유닉스 파이프와 같은 생각이다. 예전 group() 명령(4.2 에서 제거)은 $group 단계로 대신한다.

단계 SQL 로 치면 하는 일
$match WHERE / HAVING 조건에 맞는 문서만 남김
$project SELECT 필드 선택, 계산 필드 추가
$group GROUP BY 키로 묶고 $sum, $avg, $min, $max, $push, $addToSet 등으로 집계
$sort ORDER BY 정렬
$limit / $skip LIMIT / OFFSET 개수 제한, 건너뛰기
$unwind – 배열 필드를 원소마다 한 문서로 펼침
$lookup JOIN 다른 컬렉션과 조인
$out / $merge INSERT INTO … SELECT 결과를 컬렉션에 저장

4. 예제: 기사를 가장 많이 쓴 기자 5명

$match 는 되도록 앞에 둔다. 앞 단계에서 문서를 줄여야 인덱스도 타고 뒤 단계가 가볍다.

5. 알아 둘 제한

  • 각 단계는 기본 100MB 메모리 제한이 있다. 큰 데이터는 { allowDiskUse: true } 옵션을 준다. 6.0 부터는 필요하면 자동으로 디스크를 쓴다.
  • 결과는 커서로 받기 때문에 전체 크기 제한은 없다. 다만 결과 문서 하나는 16MB 를 넘을 수 없다.
  • mapReduce 는 5.0 부터 deprecated 다. 같은 일은 집계 파이프라인($group, $accumulator)으로 한다.
  • 서버에서 자바스크립트를 실행하던 db.eval() 은 4.2 에서 제거되었다. 업데이트도 updateMany 에 집계 파이프라인을 넘겨 서버에서 바로 처리할 수 있다.

관련 글: MongoDB 운영 메모 – 샤드 클러스터 종료와 시작 순서, 레플리카셋, 샤딩

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.