MongoDB集約フレームワーク(Aggregation Framework)の使い方その3
URL
date
Nov 7, 2023
slug
mongodb-aggregation-framework-basic-practices-3
status
Published
tags
MongoDB
Basic
Command
Aggregate
Project
Group
Stage
Operator
summary
MongoDB集約フレームワーク(Aggregation Framework)の使い方その2
type
Post
Aggregation Pipeline Stage
とAggregation Pipeline Operators
の使い方
MongoDBの
Aggregation Pipeline Stage
とAggregation Pipeline Operators
は種類を全部覚えるのは難しい。Python DocsやJavaScript Docsの関数を全て覚えて使うことはないのと同じで、MongoDBのAggregation Pipeline StageとAggregation Pipeline Operatorsも全て覚えて使うことはない。
なので、要件に合う機能は適宜ドキュメントを参照して使うのが大事です。
以下は、MongoDBの
Stages
とOperators
の今回は、Aggregation Pipeline Stageの中でもよく使われる
$project
と$group
の使い方を中心に練習してみます。$group
Stageの使い方と、その他Stageの使い方
ここで、Aggregation Pipelineの
$project
と$group
Stageの違いについて整理します。
MongoDBの集約フレームワーク内で使用される$group
と$project
は、ドキュメントの変換や処理に使われるオペレーターですが、それぞれ異なる目的と機能を持っています。-
$group
$group
Stageは、複数の入力ドキュメントを取り、それらを特定のキー(フィールド値)に基づいてグループ化します。そして、一つまたは複数の集約演算子(例えば、$sum
,$avg
,$max
,$min
など)を使用して、新しいフィールドを含む一つの出力ドキュメントを生成します。これにより、データセット内のアイテムの集計統計を計算することができます。 - グループ化: 同じ値を共有するフィールドに基づいてドキュメントをまとめる。
- 集計演算: 合計、平均、最大値、最小値などの統計を計算。
- データ集約: 複数のドキュメントから統計を集約して新しいドキュメントを作成。
$project
$project
Stageは、各ドキュメントのフィールドを再構成することによって、入力ドキュメントを変換します。これにより、フィールドを追加、削除、リネーム、または既存のフィールドの値を再計算して、新しいドキュメント構造を出力できます。$project
は主に、必要なデータのみを選択的に表示するために使われます。- フィールド操作: フィールドを追加、削除、または変更してドキュメントを再構成。
- データ変換: 各ドキュメントのフィールド値を変更または再計算。
- 選択的出力: 出力に含めるデータを厳選してドキュメントの形状を定義。
以下でまとめると、
$group
は、データを集約し、統計的なサマリーを生成するために使われます。- n:1関係。複数のドキュメントを1つのドキュメントにまとめる
- Sum, Count, Average, Build Array, Min, Maxなどがある。
$project
は、特定のデータを抽出または変換し、新しい形のドキュメントを生成するために使われます。- 1:1関係。1つのドキュメントを1つのドキュメントに変換する
- include/Exclude Fields, Transform Fieldsなどがある。
Aggregation Pipeline Optimizationのドキュメントは以下を参照
以下は
$project
と$group
を組み合わせた例です。その中でも、
$convert
、$toDate
、$substrCP
、$strLenCP
、$concat
などいろんなoperatorを使用しています。$bucket
と$bucketAuto
Stageを使用して、ドキュメントをグループ化する
基本的なSyntaxは、以下になる。
- groupBy
- グループ化するフィールドを指定する。
- boundaries
- グループ化するフィールドの値の範囲を指定する。
- default
- boundariesに指定した範囲に当てはまらないドキュメントをグループ化する場合の値を指定する。
- output
- グループ化したドキュメントに対して、集約演算子を使用して、新しいフィールドを追加する場合に使用する。
詳細は、ドキュメント参考
$bucketAuto
は、$bucket
と同じようにドキュメントをグループ化するが、$bucketAuto
は、グループ化するフィールドの値の範囲を自動的に決定することができる。$skip
, $limit
, $sort
Stageを使用して、ドキュメントを操作する
$skip
Stageは、ドキュメントをスキップするために使用する。
$limit
Stageは、ドキュメントを制限するために使用する。
以下の例は、
$skip
と$limit
を使用して、
10個のドキュメントをスキップ後、10個のドキュメントを取得しています。$psuh
Stageを使用して、hobbiesフィールドの値を配列に追加
$push
の説明は以下のドキュメントを参照。ここからは、以下の
friends
サンプルデータを使用します。$project
を使用したArrayの操作$size
オペレーターを使用して、配列の要素数を取得する例。$filter
operatorを使用して、配列の要素をフィルタリングする方法。複数のpipelineとoperatorを組み合わせて、以下のように書くこともできる。
friends
のデータで、高いscoreを持つドキュメントを降順で取得する。 取得フィールドは、id
とname
とmaxScore
を持つドキュメントになる。