MongoDB データを要約する

MongoDBMongoDBBeginner
今すぐ練習

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

はじめに

この実験では、MongoDB で基本的な集約操作を行う方法を学びます。これには、合計値の計算、最小値と最大値の検索、ドキュメントのカウント、平均値の計算、レポートの生成などが含まれます。この実験では、サンプルの書籍コレクションを使用した実際の例を扱い、MongoDB の集約フレームワークがデータから意味のある洞察を抽出する力を示します。

この実験では、書籍の合計価値や合計数量などの合計値の計算から始まり、段階的な手順を案内します。次に、最低と最高の書籍価格を検索し、ドキュメントの数をカウントし、平均書籍価格を計算する方法を学びます。最後に、コレクション内のデータを要約するレポートの生成方法を探ります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL mongodb(("MongoDB")) -.-> mongodb/QueryOperationsGroup(["Query Operations"]) mongodb(("MongoDB")) -.-> mongodb/DataTypesGroup(["Data Types"]) mongodb(("MongoDB")) -.-> mongodb/AggregationOperationsGroup(["Aggregation Operations"]) mongodb/QueryOperationsGroup -.-> mongodb/find_documents("Find Documents") mongodb/QueryOperationsGroup -.-> mongodb/query_with_conditions("Query with Conditions") mongodb/QueryOperationsGroup -.-> mongodb/sort_documents("Sort Documents") mongodb/QueryOperationsGroup -.-> mongodb/project_fields("Project Fields") mongodb/DataTypesGroup -.-> mongodb/use_numeric_data_types("Use Numeric Data Types") mongodb/AggregationOperationsGroup -.-> mongodb/group_documents("Group Documents") mongodb/AggregationOperationsGroup -.-> mongodb/aggregate_group_totals("Aggregate Group Totals") subgraph Lab Skills mongodb/find_documents -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/query_with_conditions -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/sort_documents -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/project_fields -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/use_numeric_data_types -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/group_documents -.-> lab-422093{{"MongoDB データを要約する"}} mongodb/aggregate_group_totals -.-> lab-422093{{"MongoDB データを要約する"}} end

合計値を計算する

このステップでは、MongoDB の集約フレームワークを使って合計値を計算する方法を学びます。数値フィールドの合計を求める方法を、サンプルの書籍コレクションを使って示します。

まず、MongoDB シェルを起動して、サンプルの書籍コレクションを作成しましょう。

mongosh

次に、価格付きの書籍のコレクションを作成します。

use bookstore

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.50, quantity: 25 },
    { title: "Web Development", price: 34.75, quantity: 40 }
])

すべての書籍の合計値を計算するには、$sum 集約演算子を使います。

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

出力例:

[
  {
    _id: null,
    totalBookValue: 5197.25
  }
]

この集約が行うことを分解してみましょう。

  • $group はすべてのドキュメントをまとめます。
  • _id: null は、コレクション全体を集約していることを意味します。
  • $multiply は各書籍の合計値(価格 * 数量)を計算します。
  • $sum はこれらすべての値を合計します。

また、書籍の合計数など、他の合計値も計算できます。

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

出力例:

[
  {
    _id: null,
    totalQuantity: 145
  }
]

最小値と最大値を検索する

このステップでは、MongoDB の集約フレームワークを使って最小値と最大値を検索する方法を学びます。前のステップで作成した書店のコレクションを引き続き使用します。

まず、既存のコレクションを確認しましょう。

use bookstore
db.books.find()

最小値と最大値の書籍価格を検索するには、$min$max 集約演算子を使います。

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

出力例:

[
  {
    _id: null,
    lowestPrice: 29.99,
    highestPrice: 45.50
  }
]

また、最小値と最大値の数量も検索できます。

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

出力例:

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

より詳細な洞察を得るために、最安値と最高値の書籍を検索できます。

db.books.aggregate([
  {
    $sort: { price: 1 }
  },
  {
    $limit: 1
  },
  {
    $project: {
      title: 1,
      price: 1
    }
  }
]);

出力例:

[
  {
    _id: ObjectId("..."),
    title: "Python Basics",
    price: 29.99
  }
]

ドキュメントをカウントする

このステップでは、さまざまな手法を使って MongoDB 内のドキュメントをカウントするさまざまな方法を学びます。前のステップで作成した書店のコレクションを使って作業を続けます。

まず、既存のコレクションを確認しましょう。

use bookstore
db.books.find()

MongoDB 内のドキュメントをカウントする方法は複数あります。それらを見ていきましょう。

  1. 基本的なカウント方法:
db.books.countDocuments();

出力例:

4
  1. フィルター付きでドキュメントをカウントする:
db.books.countDocuments({ price: { $gt: 35 } });

これは価格が 35 より高い書籍の数をカウントします。

出力例:

2
  1. 集約フレームワークを使ったカウント:
db.books.aggregate([
  {
    $match: { quantity: { $gte: 30 } }
  },
  {
    $count: "booksWithHighQuantity"
  }
]);

これは数量が 30 以上の書籍の数をカウントします。

出力例:

[
  {
    booksWithHighQuantity: 3
  }
]
  1. 一意の値をカウントする:
db.books.aggregate([
  {
    $group: {
      _id: "$title",
      count: { $sum: 1 }
    }
  }
]);

これは各書籍のタイトルが何回登場するかを示します。

出力例:

[
  {
    _id: "Python Basics",
    count: 1
  },
...
]

平均値を計算する

このステップでは、MongoDB の集約フレームワークを使って平均値を計算する方法を学びます。前のステップで作成した書店のコレクションを使って作業を続けます。

まず、既存のコレクションを確認しましょう。

use bookstore
db.books.find()
  1. 平均書籍価格を計算する:
db.books.aggregate([
  {
    $group: {
      _id: null,
      averagePrice: { $avg: "$price" }
    }
  }
]);

出力例:

[
  {
    _id: null,
    averagePrice: 37.56
  }
]
  1. 四捨五入した平均数量を計算する:
db.books.aggregate([
  {
    $group: {
      _id: null,
      averageQuantity: { $avg: "$quantity" }
    }
  },
  {
    $project: {
      averageQuantity: { $round: ["$averageQuantity", 2] }
    }
  }
]);

出力例:

[
  {
    _id: null,
    averageQuantity: 36.25
  }
]
  1. 条件付きグループ化による平均価格:
db.books.aggregate([
  {
    $group: {
      _id: {
        priceCategory: {
          $switch: {
            branches: [
              { case: { $lt: ["$price", 35] }, then: "Budget" },
              { case: { $gte: ["$price", 35] }, then: "Premium" }
            ]
          }
        }
      },
      averagePrice: { $avg: "$price" }
    }
  }
]);

出力例:

[
  {
    _id: { priceCategory: "Budget" },
    averagePrice: 32.37
  },
  {
    _id: { priceCategory: "Premium" },
    averagePrice: 42.75
  }
]

レポートを生成する

この最後のステップでは、MongoDB の集約フレームワークを使ってより複雑なレポートを生成する方法を学びます。書店のコレクションから洞察に富んだレポートを作成するために、複数の集約段階を組み合わせます。

まず、既存のコレクションを確認しましょう。

use bookstore
db.books.find()
  1. 包括的な書籍在庫レポート:
db.books.aggregate([
  {
    $project: {
      title: 1,
      totalValue: { $multiply: ["$price", "$quantity"] },
      inventoryStatus: {
        $switch: {
          branches: [
            { case: { $lt: ["$quantity", 30] }, then: "Low Stock" },
            { case: { $gte: ["$quantity", 30] }, then: "In Stock" }
          ]
        }
      }
    }
  },
  {
    $sort: { totalValue: -1 }
  }
]);

出力例:

[
  {
    _id: ObjectId("..."),
    title: "Python Basics",
    totalValue: 1499.50,
    inventoryStatus: "In Stock"
  },
...
]
  1. 価格帯別分布レポート:
db.books.aggregate([
  {
    $bucket: {
      groupBy: "$price",
      boundaries: [0, 35, 45, 100],
      default: "Other",
      output: {
        count: { $sum: 1 },
        titles: { $push: "$title" }
      }
    }
  }
]);

出力例:

[
  {
    _id: 0,
    count: 2,
    titles: ["Python Basics", "Web Development"]
  },
  {
    _id: 35,
    count: 1,
    titles: ["MongoDB Essentials"]
  },
...
]
  1. 詳細な販売実績レポート:
db.books.aggregate([
  {
    $group: {
      _id: {
        priceCategory: {
          $switch: {
            branches: [
              { case: { $lt: ["$price", 35] }, then: "Budget" },
              { case: { $gte: ["$price", 35] }, then: "Premium" }
            ]
          }
        }
      },
      totalBooks: { $sum: 1 },
      totalQuantity: { $sum: "$quantity" },
      totalValue: { $sum: { $multiply: ["$price", "$quantity"] } },
      avgPrice: { $avg: "$price" }
    }
  },
  {
    $project: {
      _id: 0,
      priceCategory: "$_id.priceCategory",
      totalBooks: 1,
      totalQuantity: 1,
      totalValue: { $round: ["$totalValue", 2] },
      avgPrice: { $round: ["$avgPrice", 2] }
    }
  }
]);

出力例:

[
  {
    priceCategory: "Budget",
    totalBooks: 2,
    totalQuantity: 90,
    totalValue: 2984.50,
    avgPrice: 32.37
  },
  {
    priceCategory: "Premium",
    totalBooks: 2,
    totalQuantity: 55,
    totalValue: 2212.75,
    avgPrice: 42.75
  }
]

まとめ

この実験では、MongoDB の集約フレームワークを使って合計値を計算し、最小値と最大値を見つけ、ドキュメントをカウントし、平均値を計算し、レポートを生成する方法を学びます。まず、サンプルの書籍コレクション内のすべての書籍の合計値を $sum 集約演算子を使って計算します。また、書籍の総数をどのように計算するかも学びます。次に、$min$max 集約演算子を使って最小値と最大値の書籍価格を見つけます。その後、コレクション内のドキュメントの数をカウントし、平均書籍価格を計算する方法を学びます。