티스토리 뷰

개인 공부를 위하여 몽고 디비 공식 문서: Aggregation 을 한글로 번역한 글입니다.

Aggregation 

이 페이지에서는 다음을 다룬다.

  • Aggregation Pipeline / 어그리게이션 파이프라인
  • Map-Reduce / 맵리듀스
  • Single Purpose Aggregation Operations / 단일 목적 어그리게이션 연산
  • Additional Features and Behaviors / 추가적인 특징 및 동작

어그리게이션 연산은 데이터 레코드를 처리하고 계산된 결과를 반환한다. 여러 도큐먼트의 값을 함께 그룹화하고, 그룹화된 데이터에 다양한 연산을 수행하여 단일 결과를 반환할 수 있다. 몽고디비는 어그리게이션 수행 방법으로 3가지를 제공한다: 1) 어그리게이션 파이프라인 2) 맵리듀스 기능 3) 단일 목적 어그리게이션 메소드


Aggregation Pipeline / 어그리게이션 파이프라인

몽고디비의 어그리게이션 프레임워크는 데이터 처리 파이프라인 개념을 모델로 한다. 도큐먼트는 도큐먼트를 어그리게이션한 결과로 변형하는 다중 스테이지 파이프라인으로 들어간다. 예를 들면:

어그리게이션 - 다중 스테이지 파이프라인

예시에서,

db.orders.aggregate([
	{ $match: { status: "A" } },
	{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

첫번째 스테이지: $match 스테이지는 도큐먼트를 status 필드로 필터링하고 status가 "A"인 도큐먼트들을 다음 스테이지로 넘겨준다.

 

두번째 스테이지: $group 스테이지는 cust_id 필드로 도큐먼트를 그룹화하여 각 유니크한 cust_id별 amount의 합을 계산한다.

가장 기본적인 파이프라인 스테이지는 출력 도큐먼트의 형식을 수정하는 쿼리 및 도큐먼트 변형처럼 연산하는 필터를 제공한다. 

 

다른 파이프라인 연산은 도큐먼트를 특정 필드 또는 필드들로 그룹화하고 분류하기 위한 도구뿐 아니라 도큐먼트 배열을 포함한 배열의 내용을 집계하기 위한 도구도 제공한다. 또한, 파이프라인 스테이지는 평균 계산이나 문자열 연결과 같은 작업에 연산자를 사용할 수 있다.

 

파이프라인은 몽고디비 내에서 네이티브 연산을 사용한 효율적인 데이터 어그리게이션을 제공하고, 몽고디비에서 선호되는 데이터 어그리게이션을 위한 방법이다.

 

어그리게이션 파이프라인은 샤딩된 컬렉션에 연산할 수 있다.

 

어그리게이션 파이프라인은 인덱스를 사용하여 일부 스테이지에서 성능을 개선할 수 있다. 또한, 어그리게이션 파이프라인은 내부 최적화 단계가 있다. 자세한 내용은 파이프라인 연산자 및 인덱스어그리게이션 파이프라인 최적화를 참조하라.


Map-Reduce / 맵리듀스

몽고디비는 어그리게이션을 수행하기 위한 맵리듀스 연산 또한 제공한다. 일반적으로 맵리듀스 연산은 두 가지 단계가 있다.:

1) 스테이지: 각 도큐먼트를 처리하고 각 입력 도큐먼트에 대해 하나 이상의 객체를 emit하는 스테이지

2) 리듀스 스테이지: 맵 연산의 출력을 결합하는 스테이지

 

선택적으로, 맵리듀스는 결과를 최종 수정하기 위한 최종 스테이지를 가질 수 있다. 다른 어그리게이션 연산과 마찬가지로, 맵리듀스는 결과의 정렬 및 제한뿐만 아니라 입력 문서를 선택하는 쿼리 조건을 지정할 수 있다.

 

맵리듀스는 맵과 리듀스 연산 및 선택적인 최종 연산을 수행하기 위하여 커스텀 자바스크립트 함수를 사용한다. 커스텀 자바스크립트가 어그리게이션 파이프라인에 비해 뛰어난 유연성을 제공하지만, 일반적으로 맵리듀스는 어그리게이션 파이프라인보다 효율성이 떨어지고 복잡하다.

 

맵리듀스는 샤딩된 컬렉션에 연산할 수 있다. 맵리듀스 연산은 샤딩된 컬렉션에 출력될 수 있다. 자세한 내용은 맵리듀스와 샤딩된 컬렉션을 참조하라.

맵리듀스

 


Single Purpose Aggregation Operations / 단일 목적 어그리게이션 연산

몽고디비는 db.collection.estimatedDocumentCount(), db.collection.count(), db.collection.distinct() 또한 제공한다.

 

이 연산들은 모두 단일 컬렉션에서 도큐먼트를 어그리게이션한다. 이 연산들이 흔한 어그리게이션 프로세스에 대한 간단한 접근을 제공하지만, 어그리게이션 파이프라인과 맵리듀스의 유연성과 능력은 부족하다.

db.collection.distinct()

 


Additional Features and Behaviors / 추가적인 특징 및 연산

어그리게이션 파이프라인, 맵리듀스, 그리고 특별한 그룹 기능의 특징 비교를 위하여 어그리게이션 명령 비교를 참조하라.

728x90
댓글