MongoDB データの変換

MongoDBMongoDBBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、基本的な集計操作を使用して MongoDB のデータを変換する方法を学びます。この実験では、出力フィールドの選択、フィールドの名前変更、新しいフィールドの計算、出力の書式設定、および結果のフィルタリングという 5 つの重要な手順をカバーしています。これらの手順を通じて、MongoDB コレクションに格納されているデータを整形し、分析する実践的な経験を積むことができます。この実験では、書籍のサンプルデータセットを提供し、集計パイプラインを活用してデータを抽出、操作、より意味のある形で提示する方法を示します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/ArrayandEmbeddedDocumentsGroup(["Array and Embedded Documents"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb(("MongoDB")) -.-> mongodb/BasicOperationsGroup(["Basic Operations"]) mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query 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

まず、書店のデータベースに切り替えましょう。

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' ]
  },
  //... 他の書籍ドキュメント
]

名前変更技術を分解して説明しましょう。

  • 名前を変更したフィールドを持つネストされたオブジェクト bookInfo を作成しました。
  • nametitle を置き換えます。
  • writerauthor を置き換えます。
  • bookLengthpages を置き換えます。
  • pricingprice を置き換えます。
  • categoriesgenres として保持しました。

より単純なフィールド名変更には、$rename ステージを使用することもできます。

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

このステージは、元のドキュメント内のフィールド名を直接変更します。

新しいフィールドの計算

このステップでは、MongoDB の集計パイプラインを使用して計算を行い、新しいフィールドを作成する方法を学びます。書店のデータベースを引き続き使用します。

まず、MongoDB シェルを起動しましょう。

mongosh

書店のデータベースに切り替えます。

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"
  },
  //... 他の書籍ドキュメント
]

計算内容を分解して説明しましょう。

  • 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 の集計パイプラインを使用して出力を書式設定および変換するさまざまな技術を探ります。書店のデータベースを引き続き使用します。

まず、MongoDB シェルを起動しましょう。

mongosh

書店のデータベースに切り替えます。

use bookstore

まず、$toUpper$toLower を使用してテキストフィールドを書式設定しましょう。

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

出力例:

[
  {
    titleUpperCase: 'MONGODB BASICS',
    authorLowerCase: 'jane smith'
  },
  //... 他の書籍ドキュメント
]

次に、$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'
  },
  //... 他の書籍ドキュメント
]

配列を書式設定し、複雑な文字列表現を作成することもできます。

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'
  },
  //... 他の書籍ドキュメント
]

最後の例では、$reduce を使用して配列要素をカンマ区切りの文字列に結合しています。

結果のフィルタリング

この最後のステップでは、MongoDB の集計パイプラインを使用したさまざまなフィルタリング技術を探ります。書店のデータベースを引き続き使用して、結果をフィルタリングするさまざまな方法を実証します。

まず、MongoDB シェルを起動しましょう。

mongosh

書店のデータベースに切り替えます。

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 でデータを効率的に処理および分析するために不可欠です。