MongoDB データの集計

MongoDBBeginner
オンラインで実践に進む

はじめに

この実験では、MongoDB で基本的な集計操作を実行する方法を学びます。これらの操作により、データレコードを処理し、計算された結果を返すことができます。合計の計算、最小値と最大値の検索、ドキュメントのカウント、平均の計算方法を学びます。この実験では、サンプル bookstore コレクションを使用して、MongoDB の集計フレームワークがデータから有益な洞察を抽出する能力を実証します。

データの接続と投入

データを要約する前に、MongoDB サーバーに接続し、サンプルデータを挿入する必要があります。このステップでは、MongoDB Shell を起動し、データベースを作成し、書籍情報でコレクションを投入します。

まず、ターミナルを開き、MongoDB Shell (mongosh) を起動します。

mongosh

これで MongoDB Shell 内に入り、データベースと対話できるようになりました。bookstore という新しいデータベースに切り替えましょう。データベースが存在しない場合、最初にデータを保存したときに MongoDB が自動的に作成します。

use bookstore

次に、insertMany() メソッドを使用して、books という名前のコレクションに複数の書籍ドキュメントを挿入します。各ドキュメントは、titlepricequantity を含む 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();

出力には、先ほど挿入した 4 つのドキュメントがリストされ、それぞれに 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 というフィールドを作成し、その値を price フィールドの最大値に設定します。

期待される出力は、コレクションで見つかった最小価格と最大価格を示します。

[{ "_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 }]

ドキュメントのカウントと平均値の計算

このステップでは、ドキュメントのカウントと平均値の計算という、さらに 2 つの便利な要約テクニックを学びます。単純なカウント方法と、より複雑なシナリオのための集計フレームワークの両方を検討します。

まず、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 コレクションから価値ある洞察を引き出すために不可欠です。