Chapter 8-46. NoSQL MongDB(6/6) MongoDB Aggregation 문법

2025. 3. 27. 14:18·Database

 

 

📘 MongoDB Aggregation 문법 완전 정리

MongoDB의 Aggregation Framework는 데이터 분석과 집계 처리에 특화된 강력한 기능입니다. 데이터를 그룹화하고, 정렬하고, 필터링하고, 변형하는 데 사용됩니다.


🔍 Aggregation 이란?

여러 Document를 묶어(Grouping), 원하는 형태로 가공한 후 하나의 결과로 출력하는 방식입니다.

  • MongoDB에서 SQL의 GROUP BY, JOIN, HAVING 같은 연산을 대체합니다.
  • 복잡한 데이터 분석, 통계, 리포트를 만들 때 필수로 활용됩니다.

🧱 Aggregation Pipeline 핵심 개념

 

구성 요소 설명

Pipeline 여러 단계로 구성된 데이터 처리 흐름
Stage $match, $group, $sort 등 개별 처리 단계
Operators $avg, $sum, $count, $min, $max 등 수학 및 변환 연산자

 

🧠 MongoDB Aggregation Pipeline 예제 분석 위의 표 기준

다음은 orders 컬렉션에 대해 Aggregation Pipeline을 적용한 사례로, 고객별(cust_id)로 상태가 'A'인 주문의 amount를 합산하여 반환하는 과정입니다.


📌 사용된 쿼리

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

🔄 전체 흐름 요약

단계 설명

$match 조건 필터링 → status가 "A"인 문서만 통과시킴
$group cust_id별 그룹화 → amount를 합산하여 total 계산

📂 단계별 데이터 흐름

🗃 원본 데이터 (orders 컬렉션)

[
  { cust_id: "A123", amount: 500, status: "A" },
  { cust_id: "A123", amount: 250, status: "A" },
  { cust_id: "B212", amount: 200, status: "A" },
  { cust_id: "A123", amount: 300, status: "D" }
]

🔍 $match 단계 적용 후

[
  { cust_id: "A123", amount: 500, status: "A" },
  { cust_id: "A123", amount: 250, status: "A" },
  { cust_id: "B212", amount: 200, status: "A" }
]

✔️ status: "D"인 문서는 제거됨

🧮 $group 단계 결과

[
  { _id: "A123", total: 750 },
  { _id: "B212", total: 200 }
]

✔️ A123: 500 + 250 = 750 ✔️ B212: 200 (단일 문서)


📊 최종 결과 해석

고객 ID (_id) 총 금액 (total)

A123 750
B212 200

💡 보너스 정리

목적 해결 방법

특정 조건 데이터만 필터링 $match 사용
그룹별 통계값 구하기 $group + $sum, $avg, $max 등 활용
분석 대상 축소 $project 또는 $limit 등과 함께 사용 가능

✅ 요약

  • $match: status가 "A"인 문서만 선택
  • $group: cust_id 기준으로 그룹핑하고 amount 합산
  • 출력: 고객별 총 주문 금액

 

🔧 자주 쓰는 Aggregation Stages & 예시

1. $match – 조건 필터링 (SQL의 WHERE)

db.collection.aggregate([
  { $match: { age: { $gte: 30 } } }
])
  • 조건에 맞는 문서만 통과시킵니다.

2. $group – 그룹핑 및 집계

db.collection.aggregate([
  { $group: { _id: "$department", avgSalary: { $avg: "$salary" } } }
])
  • 부서별 평균 급여를 계산합니다.
  • _id는 그룹 기준이 되는 필드입니다.

3. $project – 필드 선택 또는 가공

db.collection.aggregate([
  { $project: { name: 1, age: 1 } }
])
  • 특정 필드만 선택하거나, 계산 필드 생성도 가능합니다.

4. $sort – 정렬

db.collection.aggregate([
  { $sort: { age: -1 } }
])
  • 내림차순(-1), 오름차순(1) 정렬

5. $limit – 개수 제한

db.collection.aggregate([
  { $limit: 5 }
])
  • 결과를 5개로 제한

6. $skip – 문서 건너뛰기

db.collection.aggregate([
  { $skip: 10 }
])
  • 앞의 10개 문서를 건너뜁니다 (페이징 처리 시 사용)

7. $unwind – 배열 분해

db.collection.aggregate([
  { $unwind: "$interests" }
])
  • 배열을 한 줄씩 펼쳐줍니다. (SQL의 UNNEST 유사)

8. $lookup – 컬렉션 간 조인

db.orders.aggregate([
  {
    $lookup: {
      from: "customers",
      localField: "customerId",
      foreignField: "_id",
      as: "customerDetails"
    }
  }
])
  • 관계형 DB의 JOIN과 동일한 효과를 MongoDB에서 구현

📊 예시: 사용자 평균 나이 계산

db.users.aggregate([
  { $group: { _id: null, averageAge: { $avg: "$age" } } }
])
  • 모든 사용자의 평균 나이를 계산합니다.
  • _id: null → 전체 문서를 하나의 그룹으로 취급

🧠 Aggregation 활용 팁

팁 설명

복잡한 조건 필터링은 $match로 먼저 수행 효율적인 파이프라인 구성 가능
$project는 성능에 영향을 줄 수 있음 필요한 필드만 남겨두도록 하자
$unwind + $group 조합 배열 내 항목을 분리 후, 그룹핑/집계 가능

✅ 마무리 요약

항목 설명

Aggregation 목적 집계/통계/데이터 변형
대표 Stage $match, $group, $project, $sort, $unwind, $lookup
응용 예시 평균 나이, 월별 매출, 조인된 상세 정보 등

💡 Aggregation은 MongoDB의 리포트용 데이터 처리의 핵심 무기입니다. 복잡한 쿼리도 pipeline으로 분할하면 쉽게 관리할 수 있어요!


📌 다음 포스트 예고: 실전 Aggregation 문제풀이 + 응용 퀴즈 준비되어 있습니다! 🚀

'Database' 카테고리의 다른 글

Chapter 8-47. Python으로 다루는 MongoDB (PyMongo)  (0) 2025.03.27
Chapter 8-45. NoSQL MongDB(5/6) MongoDB 비교문법 & 논리연산  (0) 2025.03.27
Chapter 8-44. NoSQL MongDB(4/6) 연습문제  (0) 2025.03.27
Chapter 8-43. NoSQL MongDB(3/6) 쿼리기초  (0) 2025.03.27
Chapter 8-41. NoSQL MongoDB(2/6) MongoDB의 기본 구조  (0) 2025.03.26
'Database' 카테고리의 다른 글
  • Chapter 8-47. Python으로 다루는 MongoDB (PyMongo)
  • Chapter 8-45. NoSQL MongDB(5/6) MongoDB 비교문법 & 논리연산
  • Chapter 8-44. NoSQL MongDB(4/6) 연습문제
  • Chapter 8-43. NoSQL MongDB(3/6) 쿼리기초
Chansman
Chansman
안녕하세요! 코딩을 시작한 지 얼마 되지 않은 초보 개발자 찬스맨입니다. 이 블로그는 제 학습 기록을 남기고, 다양한 코딩 실습을 통해 성장하는 과정을 공유하려고 합니다. 초보자의 눈높이에 맞춘 실습과 팁, 그리고 개발하면서 겪은 어려움과 해결 과정을 솔직하게 풀어내려 합니다. 함께 성장하는 개발자 커뮤니티가 되기를 바랍니다.
  • Chansman
    찬스맨의 프로그래밍 스토리
    Chansman
  • 전체
    오늘
    어제
    • 분류 전체보기 (787)
      • Python (32)
      • 프로젝트 (110)
      • 과제 (25)
      • Database (40)
      • 멘토링 (11)
      • 특강 (37)
      • 기술블로그 (41)
      • 기술블로그-Fastapi편 (33)
      • 기술블로그-Django편 (153)
      • 기술블로그-Flask편 (36)
      • AI 분석 (5)
      • HTML & CSS (31)
      • JavaScript (17)
      • AWS_Cloud (21)
      • 웹스크래핑과 데이터 수집 (14)
      • Flask (42)
      • Django (77)
      • Fastapi (16)
      • 연예 (14)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    life reflection
    hotcoffeecase
    btsdischarge
    self-growth
    college reunions
    travel ban
    smartphonedurability
    bts
    RM
    global politics
    lawsuitculture
    americaparty
    btsjungkook
    basalcellcarcinoma
    btscomeback
    newpoliticalparty
    chinanightlife
    chatgpterror
    titaniumcase
    gpterror
    remittance
    btsreunion
    homebartrend
    livebroadcast
    youngprofessionals
    urbantrends
    trumpmuskclash
    americanlaw
    classaction
    뷔
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Chansman
Chapter 8-46. NoSQL MongDB(6/6) MongoDB Aggregation 문법
상단으로

티스토리툴바