このチャプターでは、主に統計解析に使用されるMongoDBのアグリゲーションパイプラインについて紹介します。これは、SQLのgroup by
ステートメントと類似しています。MongoDBシェルでは、統計解析はdb.collection.aggregate()
関数を使用して実現されます。
コンセプト
アグリゲーションパイプラインは、データをパイプラインを流れる水のような抽象的な概念として扱います。パイプライン内の複数のステージでデータを処理することができます。1つのステージがデータを処理した後、処理された結果は次のステージに渡されてさらに処理されます。
統計解析でアグリゲーションパイプラインを適用する例:
- 最初のステージでは、特定の条件に基づいてコレクションから一括のドキュメントデータが取得されます。
- 2番目のステージでは、取得したドキュメントデータがグループ化および集約されます。
- 3番目のステージでは、2番目のステージからの集約データがソートされます。
全体のプロセスは、データがパイプラインの一端から流入し、複数のステージを経て最終的な結果が出力されるというパイプライン操作のようなものです。
MongoDBパイプラインサポートされる演算子
以下は、MongoDBでサポートされている一般的なパイプライン演算子です:
演算子 | 説明 |
---|---|
$match | $matchステージは条件に基づいてドキュメントデータをフィルタリングするために使用され、SQLのwhere 条件と類似しています。 |
$group | $groupステージは、ドキュメントデータをグループ化および集約するために使用され、SQLのgroup by 句と類似しています。 |
$sort | データをソートするために使用されます。 |
アグリゲーションパイプラインの使用手順
通常、次の3つのステップが関与します:
- $matchを使用して対象データをフィルタリングします。
- $groupを使用してデータをグループ化および集約します。
- $sortを使用して結果をソートします(オプション)。
例:
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
])
同等のSQL:
select sum(amount) as total from orders
where status="A"
group by cust_id
order by total desc
注意:統計解析に関する詳細情報については、後続の章を参照してください。