MongoDB

[MongoDB] Ch7 - 집계 프레임워크

잭피 2022. 1. 4. 17:10

몽고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를 사용할 때 진정한 장점은 파이프라인 실행 시 출력 컬렉션의 내용이 점진적으로 갱신되는 주문식의 구체화된 뷰를 생성할 수 있다는 점이다