[MongoDB] Ch7 - 집계 프레임워크
몽고DB는 집계 프레임워크를 사용해 분석을 실행하기 위한 강력한 지원이 제공됩니다
- 집계 프레임워크
- 집계 단계
- 집계 표현식
- 집계 누산기
7.1 파이프라인, 단계 및 조정 기능 항목
집계 프레임워크는 몽고DB 내 분석 도구 모음으로, 하나 이상의 컬렉션에 있는 도큐먼트에 대한 분석을 수행하게 해준다
집계 파이프라인은 배시와 같은 리눅스 셸 파이프라인과 매우 유사한 개념이며, 단계마다 특정 작업을 수행한다
집계 파이프라인의 개별 단계는 데이터 처리 단위다
한 번에 입력 도큐먼트 스트림을 하나씩 가져와서, 각 도큐먼트를 하나씩 처리하고, 출력 도큐먼트 스트림을 하나씩 생성한다
각 단계는 knobs 또는 tunables 셋을 제공한다
이러한 tunables은 일반적으로 필드를 수정하거나, 산술 연산을 수행하거나, 도큐먼트를 재구성하거나, 일종의 누산 작업 등 여러 작업을 수행하는 연산자 형태를 취한다
종종 동일한 유형의 단계를 단일 파이프라인에 여러 번 포함한다
7.2 단계 시작하기 : 익숙한 작업들
일치, 선출, 정렬, 건너뛰기, 제한 단계를 한 예로 살펴보자
db.companies.aggregate([
{$match : {founded_year : 2004}},
{$sort : {name : 1}},
{$skip : 10},
{$limit : 5},
{$project: {
_id:0, name:1
}},
])
7.3 표현식
집계 프레임워크는 다양한 클래스를 지원한다
불리언 표현식
불리언 표현식을 사용하면 AND, OR, NOT 표현식을 사용할 수 있다
집합 표현식
집합 표현식을 사용하면 배열을 집합을 사용할 수 있다
예를 들어, 2개 이상의 집합의 교집합, 합집합을 구할 수 있다
비교 표현식
비교 표현식을 통해 다양한 유형의 범위 필터를 표현할 수 있다
산술 표현식
산술 표현식을 사용하면 천장, 바닥, 자연 로그, 로그를 계산할 수 있을 뿐만 아니라 곱하기, 나누기, 더하기, 빼기와 같은 간단한 산술 연산을 수행할 수 있다
문자열 표현식
문자열 표현식을 사용하면 연결, 하위 문자열 검색, 대소문자 및 텍스트 검색과 관련된 작업을 수행할 수 있다
배열 표현식
배열 표현식은 배열 요소를 필터링하거나, 배열을 분할하거나, 특정 배열에서 값의 범위를 가져오는 등 배열을 조작하는 데 유용하다
가변적 표현식
가변적 표현식을 사용해 리터럴, 날짜 값 구문 분석을 위한 식, 조건식을 사용한다
누산기
누산기는 합계, 기술 통계 및 기타 여러 유형의 값을 계산하는 기능을 제공한다
7.5 $unwind
입력 도큐먼트에서 배열을 가져오고 해당 배열의 각 요소에 대한 출력 도큐먼트를 생성한다
7.6 배열 표현식
필터 표현식은 필터 기준에 따라 배열에서 요소의 부분집합을 선택한다
$filter - 첫 번째 옵션은 input (배열을 지정), 두 번째는 배열에 사용할 이름을 지정, 세 번째는 조건을 지정
조건을 지정할 때는 $$을 사용한다
$arrayElemAt 연산자를 사용하면 배열 내 슬롯에서 요소를 선택할 수 있다
$slice 표현식은 $arrayElemAt와 관련 있다
배열의 특정 인덱스에서 시작해 하나뿐 아니라 여러 항목을 순서대로 반환할 수 있다
test: {$slice : ["$data", 1, 3]}
data 배열에서 인덱스를 1부터 시작해 3개의 요소를 가져온다
$size 연산자로 배열의 크기나 길이를 결정할 수 있다
7.7 누산기
선출 단계에서 누산기 사용
$max
db.test.aggregate([
{ $match : { "data" : {$exists : true, $ne:[]}}},
{ $project : {
_id : 0
name : 1
largetst_round : {$max : "$data.amount"}
}}
])
$sum
db.test.aggregate([
{ $match : { "data" : {$exists : true, $ne:[]}}},
{ $project : {
_id : 0
name : 1
largetst_round : {$sum : "$data.amount"}
}}
])
7.8 그룹화 소개
그룹 단계는 SQL GROUP BY 명령과 유사한 기능을 수행한다
$group
db.test.aggregate([
{ $group : {
_id : { year : "$year" },
num : {$avg : "$num"}
}},
{ $sort : { num:-1}}
])
년도를 기준으로 평균 num을 계산
# 결과
{ "_id" : {"year" : 2001}, "num" : 100}
{ "_id" : {"year" : 2002}, "num" : 50}
{ "_id" : {"year" : 2003}, "num" : 70}
{ "_id" : {"year" : 2004}, "num" : 10}
7.9 집계 파이프라인 결과를 컬렉션에 쓰기
$out, $merge를 집계 마지막 단계에 사용할 수 있다
컬렉션 쓰기를 수행할 때 $merge를 사용
$out에는 몇 가지 제약 사항이 있다
동일한 데이터베이스에만 쓸 수 있고, 기존 컬렉션이 있으면 덮어쓰며, 샤딩된 컬렉션에는 쓸 수 없다
$merge는 샤딩 여부에 관계없이 모든 데이터 베이스 컬렉션에 쓸 수 있다(4.2부터 지원)
$merge를 사용할 때 진정한 장점은 파이프라인 실행 시 출력 컬렉션의 내용이 점진적으로 갱신되는 주문식의 구체화된 뷰를 생성할 수 있다는 점이다