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 StageAggregation Pipeline Operatorsの使い方


MongoDBのAggregation Pipeline StageAggregation Pipeline Operatorsは種類を全部覚えるのは難しい。
Python DocsやJavaScript Docsの関数を全て覚えて使うことはないのと同じで、MongoDBのAggregation Pipeline StageとAggregation Pipeline Operatorsも全て覚えて使うことはない。
なので、要件に合う機能は適宜ドキュメントを参照して使うのが大事です。
 
以下は、MongoDBのStagesOperators
 
今回は、Aggregation Pipeline Stageの中でもよく使われる$project$groupの使い方を中心に練習してみます。
 

$groupStageの使い方と、その他Stageの使い方


ここで、Aggregation Pipelineの$project$groupStageの違いについて整理します。 MongoDBの集約フレームワーク内で使用される$group$projectは、ドキュメントの変換や処理に使われるオペレーターですが、それぞれ異なる目的と機能を持っています。
 
  • $group $groupStageは、複数の入力ドキュメントを取り、それらを特定のキー(フィールド値)に基づいてグループ化します。そして、一つまたは複数の集約演算子(例えば、$sum, $avg, $max, $minなど)を使用して、新しいフィールドを含む一つの出力ドキュメントを生成します。これにより、データセット内のアイテムの集計統計を計算することができます。
    • グループ化: 同じ値を共有するフィールドに基づいてドキュメントをまとめる。
    • 集計演算: 合計、平均、最大値、最小値などの統計を計算。
    • データ集約: 複数のドキュメントから統計を集約して新しいドキュメントを作成。
 
  • $project $projectStageは、各ドキュメントのフィールドを再構成することによって、入力ドキュメントを変換します。これにより、フィールドを追加、削除、リネーム、または既存のフィールドの値を再計算して、新しいドキュメント構造を出力できます。$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$bucketAutoStageを使用して、ドキュメントをグループ化する


基本的なSyntaxは、以下になる。
  • groupBy
    • グループ化するフィールドを指定する。
  • boundaries
    • グループ化するフィールドの値の範囲を指定する。
  • default
    • boundariesに指定した範囲に当てはまらないドキュメントをグループ化する場合の値を指定する。
  • output
    • グループ化したドキュメントに対して、集約演算子を使用して、新しいフィールドを追加する場合に使用する。
 
詳細は、ドキュメント参考
 
$bucketAutoは、$bucketと同じようにドキュメントをグループ化するが、$bucketAutoは、グループ化するフィールドの値の範囲を自動的に決定することができる。
 
 

$skip, $limit, $sortStageを使用して、ドキュメントを操作する


  • $skipStageは、ドキュメントをスキップするために使用する。
  • $limitStageは、ドキュメントを制限するために使用する。
 
以下の例は、$skip$limitを使用して、 10個のドキュメントをスキップ後、10個のドキュメントを取得しています。
 

$psuhStageを使用して、hobbiesフィールドの値を配列に追加


$pushの説明は以下のドキュメントを参照。
 
ここからは、以下のfriendsサンプルデータを使用します。
 
 
$projectを使用したArrayの操作
 
$sizeオペレーターを使用して、配列の要素数を取得する例。
 
$filteroperatorを使用して、配列の要素をフィルタリングする方法。
 
複数のpipelineとoperatorを組み合わせて、以下のように書くこともできる。
friendsのデータで、高いscoreを持つドキュメントを降順で取得する。 取得フィールドは、idnamemaxScoreを持つドキュメントになる。
 

© EndlessDev2016 2021 - 2025