🍃

MongoDB基礎5:集計フレームワーク

2021/10/12に公開

引き続き、MongoDB Universityで提供されているオンラインコース"MongoDB Basics"の要点をまとめていきます。今回はChapter5 - "Aggregation Framework"です。

MongoDB Aggregation Framework

The Beginner’s Guide to MongoDB Aggregation (With Exercise) / studio 3T

集計フレームワークとは?

集計フレームワーク(Aggregation Framework)は、MongoDBで集計処理を行う方法の1つです。

これまでのチャプターで確認してきたクエリによる操作は全て、この集計フレームワークを用いることで再現することができます。

例えば以下のようなクエリ。

db.hotels.find({ "amenities": "Wifi" },
               { "price": 1, "address": 1, "_id": 0 }).pretty()

ホテルのコレクションの中で、アメニティーにWifiが含まれているホテルの宿泊料金と住所を一覧にして表示するものです。

集計フレームワークでは、以下のコマンドで同じ結果が得られます。

db.hotels.aggregate([
		     { "$match": { "amenities": "Wifi" } },
		     { "$project": { "price": 1,
			             "address": 1,
				     "_id": 0 }}]).pretty()

注目すべき違いは、集計フレームワークでは{ "$match": { "amenities": "Wifi" } }{ "$project": { "price": 1, "address": 1, "_id": 0 }などの項目が配列に格納されていることです。

集計フレームワークにおいてはこの配列内での順番が重要な意味を持ちます。

なぜ集計フレームワークを使うのか?

クエリがあるのになぜ集計フレームワークを使う必要があるのか?
それは、集計フレームワークを使えば、クエリにもできないことができるからです。

Aggregation Framework beyond Query

MongoDBのクエリ言語ではfilterupdateでデータを検索・更新する方法を学びました。
集計フレームワークではそれらに加え、例えばデーターの計算をしたり、コレクション間のデータを同じ階層のドキュメントとして扱えるようにしてくれます。

集計フレームワークの構文

先ほど集計フレームワークでは配列内での項目の順序が重要になると説明しましたが、これは集計フレームワークの処理が配列に格納されている順番に沿って実行されるからです。この処理ひとつをステージと表現します。

ステージ名の先頭には、$サインがついていることが特徴です。

ステージいろいろ

いくつかの主要なステージを紹介します。

  1. $group - 指定したキーのバリューごとにグループ分けをする。
例.生活費の内訳を出費タイプ別(食費、家賃)にいくら使っているかを表示したい。
{ $group: { _id: "$cost_type", total: { $sum: "$amount" } } }
  1. $match - あるキーに指定したバリューを持つドキュメントを抽出する。filterの役割。
例.バイキングで提供されている料理の内、中華料理のみを抽出したい。
{ $match: { dish_type: "Chinese" } }

まとめ

  • 集計フレームワークはMongoDBのクエリ言語よりも汎用性が高い。
  • 集計フレームワークの処理は配列に格納されているステージの順番通りに実行される。
  • 集計フレームワークのステージ名には必ず$サインがついている。

参照

https://docs.mongodb.com/manual/aggregation/#std-label-single-purpose-agg-operations

Discussion