MongoDB 데이터 요약

MongoDBBeginner
지금 연습하기

소개

이 랩에서는 MongoDB 에서 기본적인 집계 (aggregation) 작업을 수행하는 방법을 배웁니다. 이러한 작업은 데이터 레코드를 처리하고 계산된 결과를 반환할 수 있게 해줍니다. 총합 계산, 최소값 및 최대값 찾기, 문서 개수 세기, 평균 계산 등을 배우게 됩니다. 이 랩에서는 샘플 bookstore 컬렉션을 사용하여 MongoDB 의 집계 프레임워크가 데이터를 통해 의미 있는 인사이트를 추출하는 강력함을 보여줍니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 92%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

데이터 연결 및 채우기

데이터를 요약하기 전에 MongoDB 서버에 연결하고 샘플 데이터를 삽입해야 합니다. 이 단계에서는 MongoDB Shell 을 시작하고, 데이터베이스를 생성하며, 책 정보로 컬렉션을 채울 것입니다.

먼저 터미널을 열고 MongoDB Shell (mongosh) 을 시작합니다.

mongosh

이제 데이터베이스와 상호 작용할 수 있는 MongoDB Shell 내부에 있습니다. bookstore라는 새 데이터베이스로 전환해 보겠습니다. 데이터베이스가 존재하지 않으면 데이터를 처음 저장할 때 MongoDB 가 자동으로 생성합니다.

use bookstore

다음으로, insertMany() 메서드를 사용하여 books라는 컬렉션에 여러 책 문서를 삽입할 것입니다. 각 문서는 title, price, quantity를 포함하는 JSON 객체입니다.

db.books.insertMany([
  { title: "Python Basics", price: 29.99, quantity: 50 },
  { title: "MongoDB Essentials", price: 39.99, quantity: 30 },
  { title: "Data Science Guide", price: 45.5, quantity: 25 },
  { title: "Web Development", price: 34.75, quantity: 40 }
]);

문서가 성공적으로 삽입되었음을 확인하는 출력을 볼 수 있습니다.

데이터가 추가되었는지 확인하려면 find() 메서드를 사용하여 books 컬렉션의 모든 문서를 검색하고 표시할 수 있습니다.

db.books.find();

출력에는 방금 삽입한 네 개의 문서가 표시되며, 각 문서에는 MongoDB 에서 할당한 고유한 _id가 있습니다.

[
  {
    _id: ObjectId("..."),
    title: 'Python Basics',
    price: 29.99,
    quantity: 50
  },
  {
    _id: ObjectId("..."),
    title: 'MongoDB Essentials',
    price: 39.99,
    quantity: 30
  },
  {
    _id: ObjectId("..."),
    title: 'Data Science Guide',
    price: 45.5,
    quantity: 25
  },
  {
    _id: ObjectId("..."),
    title: 'Web Development',
    price: 34.75,
    quantity: 40
  }
]

이제 컬렉션 설정이 완료되었으므로 집계 작업을 수행할 수 있습니다.

총계 계산

이 단계에서는 MongoDB 의 집계 프레임워크를 사용하여 총합 값을 계산하는 방법을 배웁니다. 집계 파이프라인은 일련의 단계를 거쳐 데이터를 처리합니다. $group 단계를 사용하여 문서를 그룹화하고 $sum 연산자를 사용하여 계산을 수행할 것입니다.

먼저 모든 제목에 걸쳐 재고에 있는 총 책 수를 계산해 보겠습니다. 모든 문서를 단일 그룹으로 그룹화하고 quantity 필드의 합계를 구합니다.

db.books.aggregate([
  {
    $group: {
      _id: null,
      totalQuantity: { $sum: "$quantity" }
    }
  }
]);

명령어에 대한 설명은 다음과 같습니다.

  • db.books.aggregate([...]): books 컬렉션에서 집계 파이프라인을 시작합니다.
  • $group: 입력 문서를 그룹화하는 단계입니다.
  • _id: null: 컬렉션의 모든 문서가 단일 출력 문서로 그룹화되어야 함을 지정합니다.
  • totalQuantity: { $sum: "$quantity" }: 새 필드 totalQuantity를 정의합니다. $sum 연산자는 그룹 내 모든 문서의 quantity 필드 (접두사 $) 의 합계를 계산합니다.

예상 출력은 다음과 같습니다.

[{ "_id": null, "totalQuantity": 145 }]

다음으로, 모든 책의 총 재고 가치를 계산해 보겠습니다. 이를 위해서는 각 책의 pricequantity를 곱한 다음 결과를 합산해야 합니다.

db.books.aggregate([
  {
    $group: {
      _id: null,
      totalBookValue: { $sum: { $multiply: ["$price", "$quantity"] } }
    }
  }
]);

이 파이프라인에서는 다음과 같습니다.

  • $multiply: ["$price", "$quantity"]: 이 표현식은 각 문서의 pricequantity 필드를 곱합니다.
  • $sum: 이 연산자는 모든 문서에 대한 곱셈 결과를 합산합니다.

예상 출력은 다음과 같습니다.

[{ "_id": null, "totalBookValue": 5226.7 }]

최소 및 최대 값 찾기

데이터셋에서 최소값과 최대값을 찾는 것은 일반적인 분석 작업입니다. 이 단계에서는 $min$max 집계 연산자를 사용하여 컬렉션에서 가장 저렴하고 가장 비싼 책을 찾을 것입니다.

$sum과 마찬가지로 $min$max 연산자는 $group 단계 내에서 사용됩니다. 가장 낮은 책 가격과 가장 높은 책 가격을 모두 찾기 위해 단일 집계 파이프라인을 만들어 보겠습니다.

db.books.aggregate([
  {
    $group: {
      _id: null,
      lowestPrice: { $min: "$price" },
      highestPrice: { $max: "$price" }
    }
  }
]);

이 파이프라인은 다음과 같이 작동합니다.

  • _id: null: 모든 문서를 함께 그룹화합니다.
  • lowestPrice: { $min: "$price" }: lowestPrice 필드를 생성하고 모든 문서에서 price 필드의 최소값으로 값을 설정합니다.
  • highestPrice: { $max: "$price" }: highestPrice 필드를 생성하고 필드의 최대값으로 값을 설정합니다.

예상 출력은 컬렉션에서 찾은 최소 및 최대 가격을 보여줍니다.

[{ "_id": null, "lowestPrice": 29.99, "highestPrice": 45.5 }]

동일한 논리를 다른 숫자 필드에도 적용할 수 있습니다. 예를 들어 최소 및 최대 재고 수량을 찾으려면 quantity 필드에 $min$max를 사용합니다.

db.books.aggregate([
  {
    $group: {
      _id: null,
      lowestQuantity: { $min: "$quantity" },
      highestQuantity: { $max: "$quantity" }
    }
  }
]);

이 쿼리의 예상 출력은 다음과 같습니다.

[{ "_id": null, "lowestQuantity": 25, "highestQuantity": 50 }]

문서 수 세기 및 평균 계산

이 단계에서는 문서 수 세기 및 평균 계산이라는 두 가지 유용한 요약 기법을 배웁니다. 간단한 개수 세기 방법과 더 복잡한 시나리오를 위한 집계 프레임워크를 모두 살펴보겠습니다.

먼저 books 컬렉션에 있는 문서의 총 개수를 세어 보겠습니다. countDocuments() 메서드는 이를 수행하는 가장 간단한 방법입니다.

db.books.countDocuments();

출력은 단일 숫자입니다.

4

countDocuments()에 쿼리 필터를 제공하여 특정 기준과 일치하는 문서만 셀 수도 있습니다. 예를 들어 가격이 35 달러보다 비싼 책이 몇 권인지 세어 보겠습니다.

db.books.countDocuments({ price: { $gt: 35 } });

$gt 연산자는 "greater than"을 나타냅니다. 출력은 다음과 같습니다.

2

다음으로 집계 프레임워크를 사용하여 평균 책 가격을 계산해 보겠습니다. $group 단계 내에서 사용되는 $avg 연산자는 숫자 필드의 평균을 계산합니다.

db.books.aggregate([
  {
    $group: {
      _id: null,
      averagePrice: { $avg: "$price" }
    }
  }
]);

이 파이프라인은 모든 문서를 그룹화하고 price 필드의 평균을 계산합니다. 출력은 다음과 같습니다.

[{ "_id": null, "averagePrice": 37.56 }]

집계 프레임워크는 특히 다른 단계와 결합하여 더 복잡한 로직을 처리할 때 개수 세기 및 평균 계산과 같은 작업을 수행하는 강력하고 유연한 방법을 제공합니다.

요약 보고서 생성

이 마지막 단계에서는 여러 집계 단계를 결합하여 더 복잡한 요약 보고서를 생성합니다. 이를 통해 연산자를 연결하여 데이터에 대한 통찰력 있는 보기를 만드는 방법을 보여줍니다. 가격대를 "Budget"과 "Premium"으로 분류하고 각 범주에 대한 요약 통계를 계산하는 보고서를 만들 것입니다.

목표는 가격을 기준으로 책을 그룹화한 다음 각 그룹에 대한 제목 수, 총 수량, 총 가치 및 평균 가격을 계산하는 것입니다.

다음 집계 파이프라인을 실행합니다.

db.books.aggregate([
  {
    $group: {
      _id: {
        $cond: {
          if: { $lt: ["$price", 35] },
          then: "Budget",
          else: "Premium"
        }
      },
      totalBooks: { $sum: 1 },
      totalQuantity: { $sum: "$quantity" },
      totalValue: { $sum: { $multiply: ["$price", "$quantity"] } },
      avgPrice: { $avg: "$price" }
    }
  }
]);

이 강력한 파이프라인을 자세히 살펴보겠습니다.

  • $group: 이 단계는 보고서의 핵심입니다.
  • _id: { $cond: ... }: null 대신 $cond (조건부) 연산자를 사용하여 그룹 ID 를 동적으로 결정합니다. 책의 price가 35 보다 작으면 ($lt) "Budget" 그룹에 할당되고, 그렇지 않으면 "Premium" 그룹에 할당됩니다.
  • totalBooks: { $sum: 1 }: 이는 그룹 내 문서 수를 세는 일반적인 기법입니다. 각 문서에 대해 총계에 1을 더합니다.
  • totalQuantity, totalValue, avgPrice: 이전 단계에서 배운 것과 동일한 누적기이지만 이제 각 가격 범주 내에서 작동합니다.

출력은 각 범주에 대한 깔끔한 요약을 제공합니다. 문서 순서는 다를 수 있습니다.

[
  {
    "_id": "Premium",
    "totalBooks": 2,
    "totalQuantity": 55,
    "totalValue": 2212.75,
    "avgPrice": 42.745
  },
  {
    "_id": "Budget",
    "totalBooks": 2,
    "totalQuantity": 90,
    "totalValue": 2984.5,
    "avgPrice": 32.37
  }
]

이 예는 집계 프레임워크를 사용하여 원시 데이터를 데이터베이스 내에서 직접 구조화되고 의미 있는 보고서로 변환하는 방법을 보여줍니다.

요약

이 실습에서는 MongoDB 에서 데이터 집계의 기본 사항을 배웠습니다. 데이터베이스에 연결하고 샘플 데이터로 컬렉션을 채우는 것부터 시작했습니다. 그런 다음 집계 프레임워크를 사용하여 몇 가지 일반적인 요약 작업을 수행했습니다. $sum과 같은 연산자와 함께 $group 단계를 사용하여 합계를 계산하고, $min$max를 사용하여 경계 값을 찾고, $avg를 사용하여 평균을 계산하는 방법을 배웠습니다. 또한 간단한 개수를 세기 위해 countDocuments()를 사용하고 여러 연산자와 단계를 결합하여 다면적인 요약 보고서를 만드는 방법을 보았습니다. 이러한 기술은 데이터를 분석하고 MongoDB 컬렉션에서 귀중한 통찰력을 얻는 데 필수적입니다.