PythonでMongoDBの集計機能をマスター!Aggregation Pipelineの使い方完全ガイド
生徒
「PythonでMongoDBを使っているのですが、データの合計を出したり、グループごとに平均を計算したりする方法はありますか?」
先生
「それなら『集計パイプライン(Aggregation Pipeline)』という機能がぴったりですよ。」
生徒
「パイプライン…?なんだか難しそうな名前ですね。初心者でも使いこなせるでしょうか?」
先生
「工場のベルトコンベアをイメージすれば大丈夫です!一つずつ手順を追って説明しますね。」
1. 集計パイプライン(Aggregation Pipeline)とは?
MongoDBの集計パイプラインとは、大量のデータを特定の順序で加工し、最終的に欲しい結果を導き出すための仕組みです。プログラミング未経験の方に例えると、料理の「下ごしらえから盛り付けまでの工程」のようなものです。まず野菜を洗い(フィルタリング)、次に切り(加工)、最後に炒めて味付けする(合計や平均の計算)という一連の流れを一つの命令で実行できます。
この仕組みは「パイプライン」と呼ばれ、データが次から次へと次の工程(ステージ)に渡されていくのが特徴です。Pythonから操作する場合、この工程をリスト形式で並べるだけで、データベース側が高速に計算を行ってくれます。複雑なデータ分析も、この考え方さえ理解すれば自由自在になります。
2. パイプラインの基本構造を理解しよう
集計を行う際、データは複数のステージを通過します。各ステージでは、データの絞り込み、並べ替え、グループ化などの特定の作業が行われます。パソコンを触ったことがない方でも、工場のベルトコンベアを想像してみてください。最初に入ってきた「生のデータ」が、各工程を通るたびに形を変え、最後には「売上の合計」や「ユーザーの平均年齢」といった「完成品」になって出てきます。
Pythonでこのパイプラインを書くときは、aggregate(アグリゲート)という命令を使います。この命令の中に、実行したい工程を順番に書き込んでいくのが基本的なルールです。ステージの種類はたくさんありますが、まずはよく使うものから覚えていきましょう。
3. データを絞り込む「$match」ステージ
最初の工程としてよく使われるのが $match(マッチ)です。これは、大量のデータの中から「特定の条件に合うものだけを次の工程に回す」ためのフィルターの役割をします。例えば、全ての売上データの中から「2026年のものだけ」を選び出すような作業です。
ここで不要なデータを弾いておくことで、その後の計算が楽になり、動作も速くなります。条件の書き方は、以前学習した find 命令と同じなので、初心者の方でも馴染みやすいはずです。
from pymongo import MongoClient
# データベースへの接続
client = MongoClient('mongodb://localhost:27017/')
db = client['shop_db']
sales = db['orders']
# 「カテゴリーが家電のものだけ」を絞り込む工程
pipeline = [
{"$match": {"category": "家電"}}
]
# 集計の実行
results = sales.aggregate(pipeline)
for data in results:
print(data)
4. データをグループ化して計算する「$group」ステージ
集計の核心となるのが $group(グループ)ステージです。これは、共通の項目でデータをまとめ、合計(sum)や平均(avg)などの計算を行う工程です。例えば、クラスごとに生徒の点数をまとめて、クラスごとの合計点を出したいときに使います。
このステージでは、_id という項目で「何を基準にまとめるか」を指定し、その後に「どんな計算をするか」を書き込みます。この工程を通ることで、バラバラだったデータが一つの集計結果にまとまります。
# 店名ごとに売上金額の合計を計算する例
# _id で店名をグループ化し、total_sales で合計を計算
pipeline = [
{
"$group": {
"_id": "$shop_name",
"total_sales": {"$sum": "$amount"}
}
}
]
results = sales.aggregate(pipeline)
for res in results:
print(f"店舗: {res['_id']}, 合計売上: {res['total_sales']}円")
5. 結果を並べ替える「$sort」ステージ
集計が終わった結果を、見やすい順番に並べたいときに使うのが $sort(ソート)です。売上の高い順(降順)や、日付の古い順(昇順)などに整理する工程です。図書館の本棚がアイウエオ順に並んでいるのと同じように、データも整理されていると内容を把握しやすくなります。
数字の 1 を指定すれば小さい順(昇順)、-1 を指定すれば大きい順(降順)になります。グループ化して計算した結果をランキング形式で表示したいときには欠かせないステージです。
6. 必要な項目だけを抽出する「$project」ステージ
データにはたくさんの項目が含まれていますが、最終的な結果には「名前と合計金額だけ」を表示したい、ということがあります。そんな時に使うのが $project(プロジェクト)ステージです。これは、次の工程に渡す項目を「これとこれだけ!」と指定する作業です。
不要な情報を削ぎ落とすことで、データの見た目がスッキリするだけでなく、パソコンのメモリを節約することにも繋がります。プログラミングにおいて、必要な情報だけを正確に扱うことはとても大切な習慣です。
# 結果から名前だけを表示し、内部的なIDは非表示にする
pipeline = [
{"$match": {"status": "完了"}},
{
"$project": {
"_id": 0,
"user_name": 1,
"order_date": 1
}
}
]
results = sales.aggregate(pipeline)
for user in results:
print(user)
7. リスト形式のデータを展開する「$unwind」ステージ
MongoDBの特徴として、一つのデータの中に「趣味リスト」のような複数の値が入ったリスト(配列)を持つことがあります。このリストの中身を一つずつ個別のデータとして扱いたいときに使うのが $unwind(アンワインド)です。日本語では「展開する」や「解きほぐす」という意味があります。
例えば、「一回の注文で3つの商品を買った」というデータを、「商品Aの注文」「商品Bの注文」「商品Cの注文」という3つの独立したデータに分解してくれます。これにより、商品ごとの販売個数を正確に集計できるようになります。
8. 複数のステージを組み合わせた実践例
これまでに紹介したステージを組み合わせることで、非常に強力な集計が可能になります。「データを絞り込み」→「リストを展開し」→「グループ化して合計を出し」→「高い順に並べる」という一連の流れを一気に実行してみましょう。
Pythonのコードは少し長くなりますが、一つ一つの工程はこれまで説明した通りです。上から順番にデータが流れていく様子をイメージしながらコードを読んでみてください。これが理解できれば、実務レベルのデータ分析が可能になります。
# 2026年の注文から、商品ごとの販売合計数を算出し、多い順に並べる
pipeline = [
# 1. 2026年の注文だけに絞り込む
{"$match": {"year": 2026}},
# 2. 注文に含まれる商品リストをバラバラにする
{"$unwind": "$items"},
# 3. 商品名ごとに個数を合計する
{
"$group": {
"_id": "$items.name",
"count": {"$sum": "$items.quantity"}
}
},
# 4. 合計数が多い順に並べる
{"$sort": {"count": -1}}
]
final_results = sales.aggregate(pipeline)
print("2026年 商品別販売ランキング:")
for rank in final_results:
print(f"商品: {rank['_id']}, 販売数: {rank['count']}個")
9. 計算をさらに便利にする算術演算子
集計パイプラインの中では、単純な合計だけでなく、足し算、引き算、掛け算、割り算などの計算も自由に行えます。例えば、「単価」と「数量」を掛け合わせて「小計」を出し、さらにそこから「消費税」を計算するといった処理も、ステージの中で完結できます。
これらの計算を行う記号を演算子と呼びます。$multiply(掛け算)や $add(足し算)など、英語の単語をベースにしているので、意味を想像しやすいのが利点です。これらを $project や $addFields というステージと組み合わせることで、元のデータにはなかった新しい値を計算で作り出すことができます。
10. 集計機能を使う際の注意点とコツ
集計機能は非常に強力ですが、扱うデータが数千万件を超えるような場合は、処理に時間がかかることがあります。そんな時のコツは、できるだけ早い段階で $match を使ってデータを減らすことです。ベルトコンベアの入り口で不要なものを取り除いておけば、後の工程がスムーズになります。
また、各ステージの前後でどのようなデータの形になっているかを、少しずつテストしながら確認するのも大切です。最初は小さなデータセットで練習し、一つずつ工程を積み上げていきましょう。PythonとMongoDBの組み合わせを使いこなせれば、あなたは膨大なデータから価値ある情報を掘り出す「データサイエンティスト」の第一歩を踏み出したことになります!