MongoDB 데이터 변환

MongoDBMongoDBBeginner
지금 연습하기

💡 이 튜토리얼은 영어로 번역되었습니다. 원본을 보려면 영어로 전환

소개

이 랩에서는 기본적인 집계 연산을 사용하여 MongoDB 데이터를 변환하는 방법을 배우게 됩니다. 이 랩은 다섯 가지 주요 단계를 다룹니다: 출력 필드 선택, 필드 이름 변경, 새로운 필드 계산, 출력 형식 지정, 결과 필터링. 이러한 단계를 통해 MongoDB 컬렉션에 저장된 데이터를 재구성하고 분석하는 실질적인 경험을 얻을 수 있습니다. 이 랩은 책의 샘플 데이터 세트를 제공하며, 집계 파이프라인을 활용하여 데이터를 추출, 조작하고 보다 의미 있는 방식으로 제시하는 방법을 보여줍니다.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/BasicOperationsGroup -.-> mongodb/insert_document("Insert Document") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/DataTypesGroup -.-> mongodb/use_numeric_data_types("Use Numeric Data Types") mongodb/DataTypesGroup -.-> mongodb/work_with_array_data_types("Work with Array Data Types") mongodb/ArrayandEmbeddedDocumentsGroup -.-> mongodb/query_embedded_documents("Query Embedded Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/insert_document -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/query_with_conditions -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/project_fields -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/use_numeric_data_types -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/work_with_array_data_types -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/query_embedded_documents -.-> lab-422094{{"MongoDB 데이터 변환"}} mongodb/aggregate_group_totals -.-> lab-422094{{"MongoDB 데이터 변환"}} end

출력 필드 선택

이 단계에서는 MongoDB 의 집계 파이프라인을 사용하여 출력 필드를 선택하고 변환하는 방법을 배우겠습니다. 집계는 MongoDB 에서 데이터를 처리하고 분석하는 강력한 방법입니다.

먼저, MongoDB 셸을 실행해 보겠습니다:

mongosh

이제 작업할 책의 샘플 컬렉션을 만들어 보겠습니다:

use bookstore

db.books.insertMany([
    {
        title: "MongoDB Basics",
        author: "Jane Smith",
        price: 29.99,
        pages: 250,
        categories: ["Database", "Programming"]
    },
    {
        title: "Python Deep Dive",
        author: "John Doe",
        price: 39.99,
        pages: 450,
        categories: ["Programming", "Python"]
    },
    {
        title: "Data Science Handbook",
        author: "Alice Johnson",
        price: 49.99,
        pages: 600,
        categories: ["Data Science", "Programming"]
    }
])

이제 집계 파이프라인을 사용하여 특정 출력 필드를 선택해 보겠습니다:

db.books.aggregate([
  {
    $project: {
      _id: 0,
      bookTitle: "$title",
      bookAuthor: "$author"
    }
  }
]);

예시 출력:

[
  { bookTitle: 'MongoDB Basics', bookAuthor: 'Jane Smith' },
  { bookTitle: 'Python Deep Dive', bookAuthor: 'John Doe' },
  { bookTitle: 'Data Science Handbook', bookAuthor: 'Alice Johnson' }
]

무엇을 했는지 자세히 살펴보겠습니다:

  • $project는 문서를 재구성하는 집계 단계입니다.
  • _id: 0은 기본 MongoDB 문서 ID 를 제외합니다.
  • bookTitle: "$title"은 'title' 필드의 이름을 'bookTitle'로 변경합니다.
  • bookAuthor: "$author"는 'author' 필드의 이름을 'bookAuthor'로 변경합니다.

필드 이름 앞에 있는 $는 MongoDB 에게 해당 필드의 값을 사용하도록 지시합니다.

필드 이름 변경

이 단계에서는 MongoDB 의 집계 파이프라인을 사용하여 보다 진보된 필드 이름 변경 기술을 살펴보겠습니다. 이전 단계에서 생성한 책 컬렉션을 기반으로 진행합니다.

MongoDB 셸에서 계속 진행해 보겠습니다:

mongosh

먼저, bookstore 데이터베이스로 전환해 보겠습니다:

use bookstore

이제, 여러 필드의 이름을 변경하고 변환하기 위해 더 복잡한 $project 단계를 사용하겠습니다:

db.books.aggregate([
  {
    $project: {
      _id: 0,
      bookInfo: {
        name: "$title",
        writer: "$author",
        bookLength: "$pages",
        pricing: "$price"
      },
      genres: "$categories"
    }
  }
]);

예시 출력:

[
  {
    bookInfo: {
      name: 'MongoDB Basics',
      writer: 'Jane Smith',
      bookLength: 250,
      pricing: 29.99
    },
    genres: [ 'Database', 'Programming' ]
  },
  // ... other book documents
]

이름 변경 기술을 자세히 살펴보겠습니다:

  • 중첩된 객체 bookInfo를 생성하여 필드 이름을 변경했습니다.
  • nametitle을 대체합니다.
  • writerauthor를 대체합니다.
  • bookLengthpages를 대체합니다.
  • pricingprice를 대체합니다.
  • 또한 categoriesgenres로 유지했습니다.

더 간단한 필드 이름 변경을 위해 $rename 단계를 사용할 수도 있습니다:

db.books.aggregate([
  {
    $rename: {
      title: "bookName",
      author: "bookWriter"
    }
  }
]);

이 단계는 원본 문서의 필드 이름을 직접 변경합니다.

새로운 필드 계산

이 단계에서는 MongoDB 의 집계 파이프라인을 사용하여 계산을 수행하여 새로운 필드를 생성하는 방법을 배우겠습니다. bookstore 데이터베이스를 계속 사용하겠습니다.

MongoDB 셸을 실행하여 시작해 보겠습니다:

mongosh

bookstore 데이터베이스로 전환합니다:

use bookstore

새로운 계산된 필드를 생성하기 위해 $addFields 단계를 사용하겠습니다:

db.books.aggregate([
  {
    $addFields: {
      totalValue: { $multiply: ["$price", 1.1] },
      discountedPrice: { $multiply: ["$price", 0.9] },
      pageCategories: {
        $concat: [
          { $toString: "$pages" },
          " page ",
          { $arrayElemAt: ["$categories", 0] }
        ]
      }
    }
  }
]);

예시 출력:

[
  {
    _id: ObjectId("..."),
    title: "MongoDB Basics",
    author: "Jane Smith",
    price: 29.99,
    pages: 250,
    categories: ["Database", "Programming"],
    totalValue: 32.989,
    discountedPrice: 26.991,
    pageCategories: "250 page Database"
  },
  // ... other book documents
]

계산을 자세히 살펴보겠습니다:

  • totalValue: 가격에 1.1 을 곱합니다 (10% 마크업).
  • discountedPrice: 가격에 0.9 를 곱합니다 (10% 할인).
  • pageCategories: $concat을 사용하여 페이지 수와 첫 번째 카테고리를 결합합니다.

더 복잡한 계산도 수행할 수 있습니다. 페이지 수를 기준으로 책 평점을 계산해 보겠습니다:

db.books.aggregate([
  {
    $addFields: {
      bookRating: {
        $switch: {
          branches: [
            { case: { $lt: ["$pages", 300] }, then: "Short Book" },
            { case: { $lt: ["$pages", 500] }, then: "Medium Book" }
          ],
          default: "Long Book"
        }
      }
    }
  }
]);

이 예제는 $switch를 사용하여 페이지 수를 기준으로 책을 분류합니다.

출력 형식 지정

이 단계에서는 MongoDB 의 집계 파이프라인을 사용하여 출력을 형식 지정하고 변환하는 다양한 기술을 살펴보겠습니다. bookstore 데이터베이스를 계속 사용하겠습니다.

MongoDB 셸을 실행하여 시작해 보겠습니다:

mongosh

bookstore 데이터베이스로 전환합니다:

use bookstore

먼저, $toUpper$toLower를 사용하여 텍스트 필드의 형식을 지정해 보겠습니다:

db.books.aggregate([
  {
    $project: {
      _id: 0,
      titleUpperCase: { $toUpper: "$title" },
      authorLowerCase: { $toLower: "$author" }
    }
  }
]);

예시 출력:

[
  {
    titleUpperCase: 'MONGODB BASICS',
    authorLowerCase: 'jane smith'
  },
  // ... other book documents
]

다음으로, $round를 사용하여 숫자 값의 형식을 지정하고 형식화된 가격 문자열을 생성해 보겠습니다:

db.books.aggregate([
  {
    $project: {
      _id: 0,
      title: 1,
      roundedPrice: { $round: ["$price", 1] },
      formattedPrice: {
        $concat: ["$", { $toString: { $round: ["$price", 2] } }]
      }
    }
  }
]);

예시 출력:

[
  {
    title: 'MongoDB Basics',
    roundedPrice: 30,
    formattedPrice: '$29.99'
  },
  // ... other book documents
]

배열의 형식을 지정하고 복잡한 문자열 표현을 생성할 수도 있습니다:

db.books.aggregate([
  {
    $project: {
      _id: 0,
      title: 1,
      categoriesSummary: {
        $reduce: {
          input: "$categories",
          initialValue: "",
          in: {
            $concat: [
              "$$value",
              { $cond: [{ $eq: ["$$value", ""] }, "", ", "] },
              "$$this"
            ]
          }
        }
      }
    }
  }
]);

예시 출력:

[
  {
    title: 'MongoDB Basics',
    categoriesSummary: 'Database, Programming'
  },
  // ... other book documents
]

이 마지막 예제는 $reduce를 사용하여 배열 요소를 쉼표로 구분된 문자열로 결합합니다.

결과 필터링

이 마지막 단계에서는 MongoDB 의 집계 파이프라인을 사용하여 다양한 필터링 기술을 살펴보겠습니다. 결과 필터링의 여러 가지 방법을 보여주기 위해 bookstore 데이터베이스를 계속 사용하겠습니다.

MongoDB 셸을 실행하여 시작해 보겠습니다:

mongosh

bookstore 데이터베이스로 전환합니다:

use bookstore

먼저, 간단한 비교 연산자를 사용하여 책을 필터링해 보겠습니다:

db.books.aggregate([
  {
    $match: {
      price: { $gt: 30 },
      pages: { $lt: 500 }
    }
  }
]);

이 쿼리는 다음 조건을 만족하는 책을 필터링합니다:

  • 가격이 30 보다 큼
  • 페이지 수가 500 미만

예시 출력:

[
  {
    _id: ObjectId("..."),
    title: "Python Deep Dive",
    author: "John Doe",
    price: 39.99,
    pages: 450,
    categories: ["Programming", "Python"]
  }
]

다음으로, 배열 연산을 사용하여 더 복잡한 필터링을 사용해 보겠습니다:

db.books.aggregate([
  {
    $match: {
      categories: { $in: ["Programming"] }
    }
  }
]);

이 쿼리는 "Programming"이 카테고리에 포함된 모든 책을 찾습니다.

여러 필터링 기술을 결합할 수도 있습니다:

db.books.aggregate([
  {
    $match: {
      $or: [{ pages: { $gt: 400 } }, { categories: { $in: ["Database"] } }]
    }
  },
  {
    $project: {
      title: 1,
      pages: 1,
      categories: 1
    }
  }
]);

이 더 복잡한 쿼리는 다음을 수행합니다:

  • 페이지 수가 400 초과이거나 "Database" 카테고리에 있는 책을 찾습니다.
  • 출력에서 특정 필드만 프로젝션합니다.

예시 출력:

[
  {
    _id: ObjectId("..."),
    title: "Data Science Handbook",
    pages: 600,
    categories: ["Data Science", "Programming"]
  },
  {
    _id: ObjectId("..."),
    title: "MongoDB Basics",
    pages: 250,
    categories: ["Database", "Programming"]
  }
]

요약

이 랩에서는 MongoDB 의 집계 파이프라인을 사용하여 출력 필드를 선택하고 변환하는 방법을 배웠습니다. 먼저 샘플 책 컬렉션을 생성한 다음, $project 단계를 사용하여 특정 필드를 선택하고 이름을 변경했습니다. 또한 계산된 표현식과 중첩 필드를 사용하는 것을 포함하여 더 고급 필드 이름 변경 기술을 탐구했습니다. 마지막으로, 새로운 필드를 계산하고, 출력을 형식 지정하고, 결과를 필터링하는 방법을 배웠습니다. 이러한 기술은 MongoDB 에서 데이터를 효율적으로 처리하고 분석하는 데 필수적입니다.

OSZAR »