You are on page 1of 3

MongoDB Study 7장 집계 프레임워크

January 16, 2024

1 파이프라인, 단계 및 조정 가능 항목
다수 컬렉션에 있는 도큐먼트에 대한 분석을 수행한다. 유닉스 쉘의 파이프 개념을 기반. 몽고DB 컬렉션에서
입력을 받고, 컬렉션에서 나온 도큐먼트를 하나 이상의 단계를 거쳐 전달한다. 단계마다 해당 입력에 다른 작업을
수행한다. 각 단계는 전 단계의 출력을 입력으로 받아들인다. 모든 단계의 I/O는 도큐먼트다. Bash Shell의
파이프와 유사. 단계마다 특정 작업을 수행한다.

입력(도큐먼트) -> 단계(데이터 처리 단위 – 스트림 한 개씩 처리) -> 출력(도큐먼트 스트림)

2 단계 시작하기: 익숙한 작업들


1. 일치 match: WHERE 필터링 연산을 통해 다큐먼트의 부분집합을 가져오는 연산
2. 선출 projection: SELECT
3. 정렬 sort: ORDER BY

4. 건너뛰기 skip: OFFSET


5. 제한 limit: LIMIT

3 표현식
1. 불리언: AND, OR, NOT 등
2. 집합: 합집합, 교집합, 차집합 등

3. 비교: “$eq”/“$ne”/“$gt”/“$gte”/“$lt”/“$lte”
4. 산술: “$add”/“$subtract”/“$multiply”/“$divide”/“$mode”
5. 문자열: concat, substring 검색, 대소문자 등
(a) “$substr” : [expr, startOffset, numToReturn] 서브스트링
(b) “$concat” : [expr1[, expr2, ..., exprN]] 문자열 결합
(c) “$toLower” : expr 소문자로
(d) “$toUpper” : expr 대문자로
6. 배열: 필터링, 분할, 값의 범위 등

7. 가변적: 리터럴, 날짜, 조건식


8. 누산기: 합계, 기술 통계 계산
4 $project

1 db. companies . aggregate ([


2 { $match : {" funding_rounds . investments . financial_org . permalink ": " greylock }},
3 { $project : {
4 _id :0,
5 name :1,
6 ipo :" $ipo. pub_year ",
7 valuation :" $ipo. valuation_amount ",
8 funders :" $funding_rounds . investments . financial_org . permalink "
9 }}
10 ])

funders를 살펴보면 중첩 필드를 승격한 것을 알 수 있다. $funding_rounds 도 배열이고, inverstments도 배열


이라 결과값도 배열의 배열로 나타나는 것을 알 수 있다.

5 $unwind
flatmap 연산과 유사. 배열로 되어 있는 필드 값을 개개의 값으로 변환하여 전체를 배열화. 244페이지 첫 쿼리의
문제는 greylock이 한번이라도 펀딩 라운드에 참석한 회사의 모든 라운드를 가져온다. 그래서 같은 연산을 두 번
해주는 246페이지의 첫 번째 쿼리가 필요하다.

6 배열 표현식

6.1 $filter의 패러미터


1. input: 연산의 대상 배열
2. cond: boolean 값을 출력하는 expr, 조건 지정시 $$를 사용한다.

3. as: (Optional) input 배열의 개개의 원소에 지정할 변수 이름 지정하지 않으면 this로 지정
4. limit: (Optional) 매칭할 원소의 개수를 지정

6.2 다른 연산
1. $arrayElemAt 배열의 인덱스를 지정해서 값을 가져온다. -1은 마지막 원소를 뜻한다.
2. $slice 배열의 subarray를 연산 [“$funding_rounds”, 1, 3] 은 인덱스 1부터 3개의 요소를 가져온다.
3. $size 배열의 크기

7 누산기
$sum, $avg, $first, $last, $max, $min, $push (중복 허용), $addToSet (중복 비허용)
8 그룹화 소개
SQL의 GROUP BY와 유사. 여러 도큐먼트의 값을 집계하고 작업. $group은 _id를 지정해야 한다.
1 {
2 $group :
3 {
4 _id: <expression >, // Group key
5 <field1 >: { <accumulator1 > : <expression1 > },
6 ...
7 }
8 }

8.1 그룹 단계의 _id 필드

여러 필드로 구성 된 것도 가능.

9 집계 파이프라인 결과를 컬렉션에 쓰기


Aggregation Pipeline의 결과를 특정 컬렉션에 쓰는 두 가지 방법 1. $out 2. $merge

제약 조건 1. 마지막에만 사용 가능 2. 둘 중 하나만 사용 가능

1. $out 1. 동일한 DB에만 쓰기 가능 2. 덮어쓰기 3. 샤딩 된 컬렉션에는 쓰기 불가


2. $merge 모든 DB와 컬렉션에서 사용 가능

You might also like