SMAIVNN
article thumbnail
Published 2023. 3. 25. 18:08
[mongoDB] 집계 프레임워크 Database

집계 프레임워크란?

집계 프레임워크의 설명을 보고 사실 잘 이해가 가지 않았다. 그래서 나는 조금더 쉬운 설명을 위해 bing AI에게 물어보았고, 답을 얻을 수 있었다.

결론적으로 집계 프레임워크는 컬렉션에 있는 여러 도큐먼트의 데이터를 다양한 방식으로 결합해서 새로운 데이터를 만드는 쿼리 언어라고 이해했다.

 

집계 프레임워크는 파이프라인 개념을 기반으로 한다. 파이프라인이랑 위 사진에도 나와 있듯이 데이터 처리를 여러 단계로 나누어 처리하는 방식이며, 각 단계에서 입력 데이터를 처리하여 출력 데이터를 만들어 다음 단계로 전달한다.

 

파이프라인에는 대표적으로 일치, 선출, 정렬, 건너뛰기, 제한 단계가 있다.

 

사용하는 방법

집계 쿼리를 사용하기 위해서는 aggregate라는 메서드를 호출해야 한다. 파이프라인은 도큐먼트를 요소로 포함하는 배열로 이루어져 있다.

model.aggregate([
	{$match : {year: 2018}}, // 일치(필터) : find와 같은 작업을 한다.
	{$limit : 5}, // 제한 : 일치하는 처음 5개
	{$project : { // 선출 : 출력한다.
		_id : 0,
		name : 1}}
])

다음 코드는 year이 2018인 요소를 찾아서, 그 중 5개를 name필드만 출력하는 코드이다. 하지만 순서를 조금 바꾼 아래 코드와 결과는 유사하나 동작은 달라진다.

model.aggregate([
	{$match : {year: 2018}}, // 일치(필터) : find와 같은 작업을 한다.
	{$project : { // 선출 : 출력한다.
		_id : 0,
		name : 1}},
	{$limit : 5}, // 제한 : 일치하는 처음 5개
])

 

 

말했듯 집계 쿼리는 파이프라인 개념을 기반으로 한다. 따라서 일치 이후 선출 단계에 수백개의 도큐먼트를 전달하게 된다. 반면 앞서 먼저 본 코드는 선출 단계 이후 제한을 두어 도큐먼트 전달을 출였다. 이처럼 집계 파이프라인의 효율성을 항상 고려해야 한다.

 

정렬과 건너뛰기는 아래와 같다.

model.aggregate([
	{$match : {year: 2018}}, // 일치(필터) : find와 같은 작업을 한다.
	{$sort : {name : 1}}, // 정렬
	{$skip : 10}, // 건너뛰기
	{$limit : 5}, // 제한 : 일치하는 처음 5개
	{$project : { // 선출 : 출력한다.
		_id : 0,
		name : 1}}
])

 

$unwind

 

$project

 

$filter

설명은 아래 사진과 같다.

$filter는 3가지 옵션을 갖는데

1. input : 배열을 지정한다.

2. as : 배열에 사용할 이름을 지정한다.

3. con : 조건을 지정한다.

아래 예제에서 사용된 $$는 작업 중인 표현식 내에서 정의된 변수를 참조하는 데 사용한다.

 

$arrayElemAt

이 때 배열의 인덱스는 0부터 시작한다는 것을 잊지말자. 배열의 끝에서부터 데이터를 선택하려면 음의 정수를 사용하면 된다. 배열의 마지막 요소는 -1로 식별된다.

 

$slice

 

$size

 

$group

설명은 아래와 같다. 또한 아래 사진의 예시에서는 _id값에 $city라는 값을 주었다. 이렇게 레이블을 지정한 이유는 무엇을 기준으로 그룹화를 진행했는지 분명하지 않기 때문이다. 따라서 혼동을 피하기 위해서 그룹화할 값에 명시적으로 레이블을 지정한 것이다.

 

여담

사실 텍스트가 너무 많은 책이라 이해하기 어려웠다. 그럴때마다 AI를 이용하여 질문을 하였는데 정말 쉬운 예시로 알려주기에 놀랐다.. 이제는 정말 AI를 잘 활용하는 사람만이 살아남을 수 있을것이라는 생각이 든다..

 

본 게시물은 한빛미디어의 <MongoDB The Definitive Guide 몽고DB 완벽 가이드 3>을 요약 정리했습니다.

 

'Database' 카테고리의 다른 글

[mongoDB] 인덱스  (0) 2023.03.24
[mongoDB] 쿼리  (0) 2023.03.17
[mongoDB] 갱신 연산자  (0) 2023.03.15
profile

SMAIVNN

@SMAIVNN

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!