MongoDBでアグリゲーションを使用する方法
著者は、 Open Internet / Free Speech Fund を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。
序章
MongoDBは、コレクションと呼ばれるより大きな構造内に保持されているドキュメントに大量のデータを保存できるデータベース管理システムです。 コレクションに対してクエリを実行して、特定の条件に一致するドキュメントのサブセットを取得できますが、MongoDBのクエリメカニズムでは、返されたデータをグループ化または変換することはできません。 これは、MongoDBのクエリメカニズムだけで意味のあるデータ分析を実行するためのオプションが制限されていることを意味します。
他の多くのデータベースシステムと同様に、MongoDBではさまざまな集計操作を実行できます。 これらを使用すると、データのグループ化、特定の順序へのデータの並べ替え、返されたドキュメントの再構築、クエリでのデータのフィルタリングなど、さまざまな方法でデータレコードを処理できます。
MongoDBは、集約パイプラインを介して集約操作を提供します。これは、データドキュメントを順番に処理する一連の操作です。 このチュートリアルでは、集約パイプラインの最も一般的な機能の使用方法を例を挙げて学習します。 ドキュメントのフィルタリング、並べ替え、グループ化、変換を行ってから、これらすべての機能を一緒に使用して、多段階の処理パイプラインを形成します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- 通常のroot以外のユーザーがいるサーバー
sudo
特権とUFWで構成されたファイアウォール。 このチュートリアルは、Ubuntu 20.04を実行しているサーバーを使用して検証されており、Ubuntu20.04のこの初期サーバーセットアップチュートリアルに従ってサーバーを準備できます。 - サーバーにインストールされているMongoDB。 これを設定するには、 Ubuntu20.04にMongoDBをインストールする方法に関するチュートリアルに従ってください。
- 認証を有効にして管理ユーザーを作成することにより、サーバーのMongoDBインスタンスを保護します。 このようにMongoDBを保護するには、 Ubuntu20.04でMongoDBを保護する方法に関するチュートリアルに従ってください。
- MongoDBコレクションのクエリと結果のフィルタリングに精通していること。 MongoDBクエリの使用方法については、チュートリアルMongoDBでクエリを作成する方法に従ってください。
注:サーバーの構成、インストール、およびMongoDBの安全なインストールの方法に関するリンクされたチュートリアルは、Ubuntu20.04を参照しています。 このチュートリアルは、基盤となるオペレーティングシステムではなく、MongoDB自体に焦点を当てています。 通常、認証が有効になっている限り、オペレーティングシステムに関係なく、すべてのMongoDBインストールで機能します。
集約パイプラインを理解する
データベース管理システムを使用する場合、データベースからデータを取得するときはいつでも、クエリと呼ばれる操作を実行する必要があります。 ただし、クエリはデータベースにすでに存在するデータのみを返します。 データを分析して、データ自体ではなく、データに関するパターンやその他の情報を見つけるには、多くの場合、集計と呼ばれる別の種類の操作を実行する必要があります。
アグリゲーションは、複数のソースからのデータをグループ化し、そのデータを何らかの方法で処理して単一の結果を返します。 リレーショナルデータベースでは、データベース管理システムは通常、同じテーブル内の複数の行からデータをプルして、集計関数を実行します。 ただし、MongoDBのようなドキュメント指向データベースでは、データベースは同じコレクション内の複数のドキュメントからデータをプルします。
MongoDBを使用すると、集約パイプラインと呼ばれるメカニズムを介して集約操作を実行できます。 これらは、stagesと呼ばれる一連の宣言型データ処理操作として構築されます。 各ステージは、ドキュメントがパイプラインを通過するときにドキュメントを検査および変換し、変換された結果を後続のステージにフィードしてさらに処理します。 選択したコレクションからのドキュメントはパイプラインに入り、各ステージを通過します。あるステージからの出力が次のステージの入力を形成し、最終結果はパイプラインの最後に到達します。
このプロセスを、野菜がレストランの厨房の組立ラインを通過するようなものと考えると役立つ場合があります。 この例えでは、野菜は一連のステーションを通過し、それぞれが1つのアクション(洗浄、皮むき、切り刻み、調理、メッキ)を担当します。 同様に、集約パイプラインに入るデータは、それぞれが特定の操作を担当するいくつかの段階を経る必要があります。
ステージは、次のようなデータに対して操作を実行できます。
- フィルタリング:これはクエリに似ており、ドキュメントのリストが一連の基準によって絞り込まれます。
- sorting :選択したフィールドに基づいてドキュメントを並べ替えることができます
- transforming :ドキュメントの構造を変更できるということは、特定のフィールドを削除または名前変更したり、埋め込みドキュメント内のフィールドの名前を変更したりグループ化したりして読みやすくすることができることを意味します
- grouping :複数のドキュメントを一緒に処理して要約結果を作成することもできます
パイプラインステージは、受け取るドキュメントと同じ数を生成する必要はありません。 キッチンの例えを続けて、野菜全体を取り出して複数のスライスとして渡すチョッピングステーション、または欠陥のある野菜を拒否して次のステーションに渡す品質管理ステーションを想像してみてください。 同様に、ステージは、パイプラインの開始に入力されたコレクションから新しいドキュメントを生成したり、既存のドキュメントを除外したりできます。 さらに、同じステージが集約パイプラインに複数回出現し、複数の操作を次々に適用する場合があります。
次の手順では、サンプルデータセットとして機能するテストデータベースを準備します。 次に、最も一般的な集約パイプラインステージのいくつかを個別に使用する方法を学習します。 最後に、これらのステージを組み合わせて、完全なサンプルパイプラインを形成します。
ステップ1—テストデータの準備
アグリゲーションパイプラインがどのように機能し、どのように使用するかを学ぶために、このステップでは、MongoDBシェルを開いてローカルにインストールされたMongoDBインスタンスに接続する方法の概要を説明します。 また、サンプルコレクションを作成し、それにいくつかのサンプルドキュメントを挿入する方法についても説明します。 このガイドでは、このサンプルデータを使用して、MongoDBのさまざまなタイプの集計ステージのいくつかを説明します。
このサンプルコレクションを作成するには、管理ユーザーとしてMongoDBシェルに接続します。 このチュートリアルは、前提条件 MongoDBセキュリティチュートリアルの規則に従い、この管理ユーザーの名前が AdminSammy であり、その認証データベースが admin
. 異なる場合は、次のコマンドでこれらの詳細を変更して、独自の設定を反映させてください。
- mongo -u AdminSammy -p --authenticationDatabase admin
インストール中に設定したパスワードを入力して、シェルにアクセスします。 パスワードを入力すると、プロンプトが大なり記号に変わります(>
).
注:新しい接続では、MongoDBシェルは自動的に test
デフォルトではデータベース。 このデータベースを安全に使用して、MongoDBとMongoDBシェルを試すことができます。
または、別のデータベースに切り替えて、このチュートリアルに記載されているすべてのサンプルコマンドを実行することもできます。 別のデータベースに切り替えるには、 use
コマンドの後にデータベースの名前を続けます。
- use database_name
集計パイプラインがどのように機能するかを理解するには、さまざまな方法でフィルタリング、並べ替え、グループ化、および要約できる、さまざまなタイプの複数のフィールドを持つドキュメントのコレクションが必要です。 このガイドでは、世界で最も人口の多い20の都市を説明するサンプルコレクションを使用します。 これらのドキュメントは、東京市を説明する次のサンプルドキュメントと同じ形式になります。
{
"name": "Tokyo",
"country": "Japan",
"continent": "Asia",
"population": 37.400
}
このドキュメントには、次の情報が含まれています。
name
:都市の名前。country
:都市が位置する国。continent
:都市が位置する大陸。population
:都市の人口(百万単位)。
次を実行します insertMany()
MongoDBシェルのメソッドを使用して、という名前のコレクションを同時に作成します cities
20個のサンプルドキュメントを挿入します。 これらのドキュメントは、世界で最も人口の多い20の都市について説明しています。
- db.cities.insertMany([
- {"name": "Seoul", "country": "South Korea", "continent": "Asia", "population": 25.674 },
- {"name": "Mumbai", "country": "India", "continent": "Asia", "population": 19.980 },
- {"name": "Lagos", "country": "Nigeria", "continent": "Africa", "population": 13.463 },
- {"name": "Beijing", "country": "China", "continent": "Asia", "population": 19.618 },
- {"name": "Shanghai", "country": "China", "continent": "Asia", "population": 25.582 },
- {"name": "Osaka", "country": "Japan", "continent": "Asia", "population": 19.281 },
- {"name": "Cairo", "country": "Egypt", "continent": "Africa", "population": 20.076 },
- {"name": "Tokyo", "country": "Japan", "continent": "Asia", "population": 37.400 },
- {"name": "Karachi", "country": "Pakistan", "continent": "Asia", "population": 15.400 },
- {"name": "Dhaka", "country": "Bangladesh", "continent": "Asia", "population": 19.578 },
- {"name": "Rio de Janeiro", "country": "Brazil", "continent": "South America", "population": 13.293 },
- {"name": "São Paulo", "country": "Brazil", "continent": "South America", "population": 21.650 },
- {"name": "Mexico City", "country": "Mexico", "continent": "North America", "population": 21.581 },
- {"name": "Delhi", "country": "India", "continent": "Asia", "population": 28.514 },
- {"name": "Buenos Aires", "country": "Argentina", "continent": "South America", "population": 14.967 },
- {"name": "Kolkata", "country": "India", "continent": "Asia", "population": 14.681 },
- {"name": "New York", "country": "United States", "continent": "North America", "population": 18.819 },
- {"name": "Manila", "country": "Philippines", "continent": "Asia", "population": 13.482 },
- {"name": "Chongqing", "country": "China", "continent": "Asia", "population": 14.838 },
- {"name": "Istanbul", "country": "Turkey", "continent": "Europe", "population": 14.751 }
- ])
出力には、新しく挿入されたオブジェクトに割り当てられたオブジェクト識別子のリストが含まれます。
Output{
"acknowledged" : true,
"insertedIds" : [
ObjectId("612d1e835ebee16872a109a4"),
ObjectId("612d1e835ebee16872a109a5"),
ObjectId("612d1e835ebee16872a109a6"),
ObjectId("612d1e835ebee16872a109a7"),
ObjectId("612d1e835ebee16872a109a8"),
ObjectId("612d1e835ebee16872a109a9"),
ObjectId("612d1e835ebee16872a109aa"),
ObjectId("612d1e835ebee16872a109ab"),
ObjectId("612d1e835ebee16872a109ac"),
ObjectId("612d1e835ebee16872a109ad"),
ObjectId("612d1e835ebee16872a109ae"),
ObjectId("612d1e835ebee16872a109af"),
ObjectId("612d1e835ebee16872a109b0"),
ObjectId("612d1e835ebee16872a109b1"),
ObjectId("612d1e835ebee16872a109b2"),
ObjectId("612d1e835ebee16872a109b3"),
ObjectId("612d1e835ebee16872a109b4"),
ObjectId("612d1e835ebee16872a109b5"),
ObjectId("612d1e835ebee16872a109b6"),
ObjectId("612d1e835ebee16872a109b7")
]
}
を実行すると、ドキュメントが正しく挿入されたことを確認できます。 find()
上のメソッド cities
引数のないコレクション。 これにより、コレクション内のすべてのドキュメントが取得されます。
- db.cities.find()
Output{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
. . .
サンプルデータを配置したら、次のステップに進んで、を使用して集計パイプラインを構築する方法を学ぶことができます。 $match
ステージ。
ステップ2—を使用する $match
集約段階
集約パイプラインを作成するには、MongoDBを使用できます aggregate()
方法。 このメソッドは、 find()
コレクション内のデータをクエリするために使用されるメソッドですが、 aggregate()
1つ以上のステージ名を引数として受け入れます。 このステップでは、の使用方法に焦点を当てます $match
集約段階。
簡単なドキュメント構造の処理、要約、または複雑な変換を行う場合でも、通常は、特定の基準に一致するドキュメントの選択のみに分析を集中させる必要があります。 $match
パイプラインの任意のステップでドキュメントのリストを絞り込むために使用でき、後続のすべての操作が限られたエントリのリストで実行されるようにするために使用できます。
例として、次の操作を実行します。 これにより、単一のアグリゲーションパイプラインが構築されます $match
特定のフィルタリングクエリを使用しないステージ:
- db.cities.aggregate([
- { $match: { } }
- ])
The aggregate()
で実行されるメソッド cities
collectionは、メソッド引数として渡された集約パイプラインを実行するようにMongoDBに指示します。 集約パイプラインはマルチステッププロセスであるため、引数はステージのリストであり、角かっこを使用します []
複数の要素の配列を示します。
この配列内の各要素は、処理ステージを記述するオブジェクトです。 ここのステージは次のように書かれています { $match: { } }
. 処理段階を説明するこのドキュメントでは、キー $match
ステージタイプと値を参照します { }
そのパラメータについて説明します。 この例では、 $match
stageは、空のクエリドキュメントをパラメータとして使用し、処理パイプライン全体で唯一のステージです。
それを覚えておいてください $match
コレクションからドキュメントのリストを絞り込みます。 フィルタリングパラメーターが適用されていない場合、MongoDBはコレクションからすべての都市のリストを返します。
Output{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
{ "_id" : ObjectId("612d1e835ebee16872a109a5"), "name" : "Mumbai", "country" : "India", "continent" : "Asia", "population" : 19.98 }
{ "_id" : ObjectId("612d1e835ebee16872a109a6"), "name" : "Lagos", "country" : "Nigeria", "continent" : "Africa", "population" : 13.463 }
{ "_id" : ObjectId("612d1e835ebee16872a109a7"), "name" : "Beijing", "country" : "China", "continent" : "Asia", "population" : 19.618 }
{ "_id" : ObjectId("612d1e835ebee16872a109a8"), "name" : "Shanghai", "country" : "China", "continent" : "Asia", "population" : 25.582 }
. . .
次に、を実行します aggregate()
メソッドを再度実行しますが、今回はクエリドキュメントをパラメータとして含めます。 $match
ステージ。 ここでは、任意の有効なクエリドキュメントを使用できます。
あなたは使用することを考えることができます $match
コレクションをクエリするのと同等のステージ find()
前提条件のセクションにリストされているMongoDBでクエリを作成する方法チュートリアルで説明されているように。 最大の違いは $match
集計パイプラインで複数回使用できるため、パイプラインの早い段階ですでに処理および変換されたドキュメントをクエリできます。 このガイドの後半で、同じ集計パイプラインで同じステージを複数回使用する方法について詳しく学習します。
次を実行します aggregate()
方法。 この例には、 $match
北米から都市のみを選択するステージ:
- db.cities.aggregate([
- { $match: { "continent": "North America" } }
- ])
今回は { "continent": "North America" }
クエリドキュメントがパラメータとして表示されます $match
ステージ。 その結果、MongoDBは北米から2つの都市を返します。
Output{ "_id" : ObjectId("612d1e835ebee16872a109b0"), "name" : "Mexico City", "country" : "Mexico", "continent" : "North America", "population" : 21.581 }
{ "_id" : ObjectId("612d1e835ebee16872a109b4"), "name" : "New York", "country" : "United States", "continent" : "North America", "population" : 18.819 }
このコマンドは、代わりにを使用する次のコマンドと同じ出力を返します find()
データベースをクエリするメソッド:
- db.cities.find({ "continent": "North America" })
以前 aggregate()
メソッドは2つの都市しか返さないため、実験することはあまりありません。 より多くの結果を返すには、次のコマンドを変更して、北米とアジアの都市を返します。
- db.cities.aggregate([
- { $match: { "continent": { $in: ["North America", "Asia"] } } }
- ])
クエリドキュメントの構文は、同じデータを使用して同じデータを取得する方法と同じであることに注意してください。 find()
方法。 今回、MongoDBは14の異なる都市を返します。
Output{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
{ "_id" : ObjectId("612d1e835ebee16872a109a5"), "name" : "Mumbai", "country" : "India", "continent" : "Asia", "population" : 19.98 }
. . .
これで、集約パイプラインを実行する方法と、 $match
コレクションのドキュメントを絞り込むためのステージ。 を使用してより複雑なパイプラインを構築する方法を学ぶために読み続けてください $sort
結果を注文し、複数のステージを組み合わせてステージングします。
ステップ3—を使用する $sort
集約段階
The $match
ステージは、次の集計ステージに移動するドキュメントのリストを絞り込むのに役立ちます。 でも、 $match
データがパイプラインを通過するときに、データを変更または変換することはありません。
データベースにクエリを実行する場合、結果を取得するときに特定の順序を期待するのが一般的です。 標準のクエリメカニズムを使用して、を追加することでドキュメントの順序を指定できます sort()
最後までの方法 find()
クエリ。 たとえば、コレクション内のすべての都市を取得し、人口の降順で並べ替えるには、次のような操作を実行できます。
- db.cities.find().sort({ "population": -1 })
MongoDBは、東京から始まり、デリー、ソウルなどの順に各都市を返します。
Output{ "_id" : ObjectId("612d1e835ebee16872a109ab"), "name" : "Tokyo", "country" : "Japan", "continent" : "Asia", "population" : 37.4 }
{ "_id" : ObjectId("612d1e835ebee16872a109b1"), "name" : "Delhi", "country" : "India", "continent" : "Asia", "population" : 28.514 }
{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
. . .
または、次を含めることで、集計パイプライン内のドキュメントを並べ替えることができます。 $sort
ステージ。 これを説明するために、以下を実行します aggregate()
方法。 これは、を使用した前の例と同様の構文に従います。 $match
ステージ:
- db.cities.aggregate([
- { $sort: { "population": -1 } }
- ])
この場合も、集約パイプラインで使用されるステージのリストは、角括弧のペアの間でステージ定義の配列として渡されます([]
). この例のステージ定義には、単一のステージ定義のみが含まれています $sort
キーとしてのステージ。その値は、ソートパラメータを保持するドキュメントです。 ここでは、任意の有効なソートドキュメントを使用できます。
MongoDBは、以前と同じ結果セットを返します find()
並べ替えステージだけで集計パイプラインを使用することは、並べ替え順序が適用された標準のクエリと同等であるため、操作は次のようになります。
Output{ "_id" : ObjectId("612d1e835ebee16872a109ab"), "name" : "Tokyo", "country" : "Japan", "continent" : "Asia", "population" : 37.4 }
{ "_id" : ObjectId("612d1e835ebee16872a109b1"), "name" : "Delhi", "country" : "India", "continent" : "Asia", "population" : 28.514 }
{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
. . .
北米の都市を人口の昇順で並べ替えて取得するとします。 これを行うには、2つの処理ステージを次々に適用できます。最初のステージでは、フィルタリングを使用して結果セットを絞り込みます。 $match
ステージと次に、を使用して必要な順序を適用するための秒 $sort
ステージ:
- db.cities.aggregate([
- { $match: { "continent": "North America" } },
- { $sort: { "population": 1 } }
- ])
コマンド構文の2つの別々のステージが、stages配列内でコンマで区切られていることに注意してください。
今回、MongoDBは、人口が少ないニューヨークから始めて、北米から2つの都市であるニューヨークとメキシコシティを表すドキュメントを返します。
Output{ "_id" : ObjectId("612d1e835ebee16872a109b4"), "name" : "New York", "country" : "United States", "continent" : "North America", "population" : 18.819 }
{ "_id" : ObjectId("612d1e835ebee16872a109b0"), "name" : "Mexico City", "country" : "Mexico", "continent" : "North America", "population" : 21.581 }
これらの結果を取得するために、MongoDBは最初にドキュメントコレクションを $match
ステージで、クエリ基準に対してドキュメントをフィルタリングし、結果を並べ替えを担当する次のステージに結果を転送しました。 ちょうどのように $match
ステージ、 $sort
集計パイプラインに複数回表示でき、集計中にドキュメント構造にのみ表示されるフィールドなど、必要なフィールドでドキュメントを並べ替えることができます。
注:集計パイプラインの開始時、プロジェクション、グループ化、またはその他の変換ステージの前にフィルタリングと並べ替えのステージを実行する場合、MongoDBはインデックスを使用して、標準のクエリと同じようにパフォーマンスを最大化します。 インデックスの詳細については、MongoDBでインデックスを使用する方法に関するガイドをご覧ください。
ステップ4—を使用する $group
集約段階
The $group
集約ステージは、ドキュメントのグループ化と要約を担当します。 複数のドキュメントを取り込み、グループ化された式の値に基づいてそれらをいくつかの個別のバッチに配置し、個別のバッチごとに1つのドキュメントを出力します。 出力ドキュメントはグループに関する情報を保持し、グループのドキュメントのリスト全体の合計や平均などの追加の計算フィールドを含めることができます。
説明のために、以下を実行します aggregate()
方法。 これには、 $group
結果のドキュメントを各都市が配置されている大陸ごとにグループ化するステージ:
- db.cities.aggregate([
- { $group: { "_id": "$continent" } }
- ])
MongoDBでは、すべてのドキュメントに _id
主キーとして使用されるフィールド。 ステップ1から、 insertMany()
サンプルコレクションの作成に使用されたメソッドには、このフィールドがサンプルドキュメントに含まれていませんでした。 これは、MongoDBがこのフィールドを自動的に作成し、次の形式で一意の識別番号を生成するためです。 ObjectId
田畑。 為に $group
ただし、集約パイプライン内のステージでは、 _id
有効な式を持つフィールド。
これ aggregate()
ただし、メソッドは指定します _id
価値; つまり、 continent
の各ドキュメントのフィールド cities
コレクション。 このような集計パイプラインのフィールドの値を参照する場合は常に、フィールドの名前の前にドル記号($
). MongoDBでは、これはフィールドパスと呼ばれます。これは、パイプラインステージで使用される値を見つけることができる適切なフィールドに操作を指示するためです。
この例では、 "$continent"
MongoDBに continent
元のドキュメントのフィールドを作成し、その値を使用して集計パイプラインで式の値を作成します。 MongoDBは、そのグループ化式の一意の値ごとに1つのドキュメントを出力します。
Output{ "_id" : "Africa" }
{ "_id" : "Asia" }
{ "_id" : "South America" }
{ "_id" : "Europe" }
{ "_id" : "North America" }
この例では、コレクションに含まれる5つの大陸ごとに1つのドキュメントを出力します。 デフォルトでは、グループ化ステージには、元のドキュメントの追加フィールドは含まれません。これは、他の値を取得する方法やドキュメントがわからないためです。
ただし、グループ化式で複数の単一フィールド値を指定することはできます。 次の例のメソッドは、の値に基づいてドキュメントをグループ化します。 continent
と country
ドキュメント:
- db.cities.aggregate([
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- }
- }
- }
- ])
に注意してください _id
この例のグループ化式のフィールドは、埋め込まれたドキュメントを使用します。このドキュメントには、大陸名用と国名用の2つのフィールドがあります。 両方のフィールドは、フィールドパスのドル記号表記を使用して元のドキュメントのフィールドを参照します。
今回は、コレクションに14の異なる国と大陸のペアがあるため、MongoDBは14の結果を返します。
Output{ "_id" : { "continent" : "Europe", "country" : "Turkey" } }
{ "_id" : { "continent" : "South America", "country" : "Argentina" } }
{ "_id" : { "continent" : "Asia", "country" : "Bangladesh" } }
{ "_id" : { "continent" : "Asia", "country" : "Philippines" } }
{ "_id" : { "continent" : "Asia", "country" : "South Korea" } }
{ "_id" : { "continent" : "Asia", "country" : "Japan" } }
{ "_id" : { "continent" : "Asia", "country" : "China" } }
{ "_id" : { "continent" : "North America", "country" : "United States" } }
{ "_id" : { "continent" : "North America", "country" : "Mexico" } }
{ "_id" : { "continent" : "Africa", "country" : "Nigeria" } }
{ "_id" : { "continent" : "Asia", "country" : "India" } }
{ "_id" : { "continent" : "Asia", "country" : "Pakistan" } }
{ "_id" : { "continent" : "Africa", "country" : "Egypt" } }
{ "_id" : { "continent" : "South America", "country" : "Brazil" } }
これらの結果は、意味のある方法で並べられていません。 データを操作する機会が増えるにつれて、より複雑なデータ分析を実行したい状況に遭遇する可能性があります。 この目的のために、MongoDBは多数のアキュムレータ演算子を提供しており、データに関するより詳細な詳細を見つけることができます。 アキュムレータ演算子は、単にアキュムレータと呼ばれることもあり、複数の値の合計や平均など、集計パイプラインを通過するときにその値または状態を維持する特殊なタイプの操作です。 。
説明のために、以下を実行します aggregate()
方法。 このメソッドの $group
ステージは必要なものを作成します _id
グループ化式と3つの追加の計算フィールド。 これらの計算フィールドにはすべて、アキュムレータ演算子とその値が含まれています。 これらの計算フィールドの内訳は次のとおりです。
highest_population
:このフィールドには、グループ内の最大人口値が含まれます。 The$max
アキュムレータ演算子は、の最大値を計算します"$population"
グループ内のすべてのドキュメントにわたって。first_city
:グループの最初の都市の名前が含まれます。 The$first
アキュムレータ演算子は、"$name"
グループに表示される最初のドキュメントから。 ドキュメントのリストが順序付けされていないため、これによって自動的に人口が最も多い都市になるのではなく、MongoDBが各グループ内で最初に検出する都市になることに注意してください。cities_in_top_20
:各大陸と国のペアのコレクション内の都市の数を保持します。 これを達成するために、$sum
アキュムレータ演算子は、リスト内のすべてのペアの合計を計算するために使用されます。 この例では、合計はドキュメントごとに1つであり、ソースドキュメントの特定のフィールドを参照していません。
ユースケースに必要な数の計算フィールドを追加できますが、今のところ、次のクエリ例を実行します。
- db.cities.aggregate([
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- },
- "highest_population": { $max: "$population" },
- "first_city": { $first: "$name" },
- "cities_in_top_20": { $sum: 1 }
- }
- }
- ])
MongoDBは、グループ化式で定義された一意のグループごとに1つずつ、次の14のドキュメントを返します。
Output{ "_id" : { "continent" : "North America", "country" : "United States" }, "highest_population" : 18.819, "first_city" : "New York", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Asia", "country" : "Philippines" }, "highest_population" : 13.482, "first_city" : "Manila", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "North America", "country" : "Mexico" }, "highest_population" : 21.581, "first_city" : "Mexico City", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Africa", "country" : "Nigeria" }, "highest_population" : 13.463, "first_city" : "Lagos", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Asia", "country" : "India" }, "highest_population" : 28.514, "first_city" : "Mumbai", "cities_in_top_20" : 3 }
{ "_id" : { "continent" : "Asia", "country" : "Pakistan" }, "highest_population" : 15.4, "first_city" : "Karachi", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Africa", "country" : "Egypt" }, "highest_population" : 20.076, "first_city" : "Cairo", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "South America", "country" : "Brazil" }, "highest_population" : 21.65, "first_city" : "Rio de Janeiro", "cities_in_top_20" : 2 }
{ "_id" : { "continent" : "Europe", "country" : "Turkey" }, "highest_population" : 14.751, "first_city" : "Istanbul", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Asia", "country" : "Bangladesh" }, "highest_population" : 19.578, "first_city" : "Dhaka", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "South America", "country" : "Argentina" }, "highest_population" : 14.967, "first_city" : "Buenos Aires", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Asia", "country" : "South Korea" }, "highest_population" : 25.674, "first_city" : "Seoul", "cities_in_top_20" : 1 }
{ "_id" : { "continent" : "Asia", "country" : "Japan" }, "highest_population" : 37.4, "first_city" : "Osaka", "cities_in_top_20" : 2 }
{ "_id" : { "continent" : "Asia", "country" : "China" }, "highest_population" : 25.582, "first_city" : "Beijing", "cities_in_top_20" : 3 }
返されるドキュメントのフィールド名は、グループ化ステージドキュメントの計算されたフィールド名に対応しています。 結果をさらに詳しく調べるために、焦点を1つのドキュメントに絞り込みましょう。
{ "_id" : { "continent" : "Asia", "country" : "Japan" }, "highest_population" : 37.4, "first_city" : "Osaka", "cities_in_top_20" : 2 }
The _id
フィールドは、日本とアジアのグループ化式の値を保持します。 The cities_in_top_20
フィールドは、2つの日本の都市が最も人口の多い20の都市のリストに含まれていることを示しています。 手順1で、日本の都市(東京と大阪)を表す2つのドキュメントのみを追加したことを思い出してください。したがって、この値は正しいです。 The highest_population
東京の人口に相当しますが、これは確かに2つの中でより高い人口です。
しかし first_city
予想通り、東京ではなく大阪を示しています。 これは、グループ化の段階で、母集団順に並べられていないソースドキュメントのリストが使用されたため、そのシナリオでの「最初」の論理的な意味を保証できなかったためです。 大阪は最初にパイプラインによって処理されたため、 first_city
フィールド値。
ステップ6で、並べ替えとグループ化の段階を戦略的に組み合わせることで、これを変更する方法を学習します。 ただし、今のところ、プロジェクションを使用してパイプライン内のドキュメントの構造を変換する方法の概要を説明するステップ5に進むことができます。
注:このステップで説明した3つに加えて、MongoDBには、さまざまな集計に使用できるアキュムレーター演算子がいくつかあります。 グループ化とアキュムレータの演算子の詳細については、公式のMongoDBドキュメントに従うことをお勧めします。
ステップ5—を使用する $project
集約段階
集計パイプラインを使用する場合、ドキュメントコレクションの複数のフィールドの一部のみを返すか、構造を少し変更して一部のフィールドを埋め込みドキュメントに移動したい場合があります。 この戦略を使用して、レポートに含めるべきではないフィールドを編集したり、特定のアプリケーション要件に対応できる形式で結果を準備したりできます。
たとえば、サンプルコレクション内の各都市の人口を取得したいが、結果を次の形式にしたいとします。
{
"location" : {
"country" : "South Korea",
"continent" : "Asia"
},
"name" : "Seoul",
"population" : 25.674
}
The location
フィールドには国と大陸のペアが含まれ、都市の名前と人口は次のように表示されます。 name
と population
それぞれフィールド、およびドキュメント識別子 _id
出力されたドキュメントには表示されません。
あなたは使用することができます $project
集約パイプラインで新しいドキュメント構造を構築するステージ。これにより、結果セットでの結果のドキュメントの表示方法が変更されます。
説明のために、以下を実行します aggregate()
を含む方法 $project
ステージ:
- db.cities.aggregate([
- {
- $project: {
- "_id": 0,
- "location": {
- "country": "$country",
- "continent": "$continent",
- },
- "name": "$name",
- "population": "$population"
- }
- }
- ])
この値 $project
ステージは、出力構造を説明するProjectionドキュメントです。 これらのプロジェクションドキュメントは、クエリで使用されるものと同じ形式に従い、包含プロジェクションまたは除外プロジェクションとして作成されます。 投影ドキュメントキーは、入力ドキュメントからのキーに対応します。 $project
ステージ。
投影ドキュメントに次のキーが含まれている場合 1
それらの値として、結果に含まれるフィールドのリストを記述します。 一方、投影キーがに設定されている場合 0
、プロジェクションドキュメントには、結果から除外されるフィールドのリストが記載されています。
集計パイプラインでは、予測に追加の計算フィールドを含めることもできます。 このような場合、投影は自動的に包含投影になり、 _id
フィールドを追加することで抑制できます "_id": 0
投影ドキュメントに。 計算フィールドは、値にドル記号フィールドパス表記を使用し、入力ドキュメントからの値を参照できます。
この例では、ドキュメント識別子は次のように抑制されます。 "_id": 0
、 name
と population
を参照する計算フィールドです name
と population
それぞれ、入力ドキュメントのフィールド。 The location
フィールドは、2つの追加キーを持つ埋め込みドキュメントになります。 country
と continent
、入力ドキュメントのフィールドを参照します。
このプロジェクションステージを使用して、MongoDBは次のドキュメントを返します。
Output{ "location" : { "country" : "South Korea", "continent" : "Asia" }, "name" : "Seoul", "population" : 25.674 }
{ "location" : { "country" : "India", "continent" : "Asia" }, "name" : "Mumbai", "population" : 19.98 }
{ "location" : { "country" : "Nigeria", "continent" : "Africa" }, "name" : "Lagos", "population" : 13.463 }
{ "location" : { "country" : "China", "continent" : "Asia" }, "name" : "Beijing", "population" : 19.618 }
{ "location" : { "country" : "China", "continent" : "Asia" }, "name" : "Shanghai", "population" : 25.582 }
{ "location" : { "country" : "Japan", "continent" : "Asia" }, "name" : "Osaka", "population" : 19.281 }
{ "location" : { "country" : "Egypt", "continent" : "Africa" }, "name" : "Cairo", "population" : 20.076 }
{ "location" : { "country" : "Japan", "continent" : "Asia" }, "name" : "Tokyo", "population" : 37.4 }
{ "location" : { "country" : "Pakistan", "continent" : "Asia" }, "name" : "Karachi", "population" : 15.4 }
{ "location" : { "country" : "Bangladesh", "continent" : "Asia" }, "name" : "Dhaka", "population" : 19.578 }
{ "location" : { "country" : "Brazil", "continent" : "South America" }, "name" : "Rio de Janeiro", "population" : 13.293 }
{ "location" : { "country" : "Brazil", "continent" : "South America" }, "name" : "São Paulo", "population" : 21.65 }
{ "location" : { "country" : "Mexico", "continent" : "North America" }, "name" : "Mexico City", "population" : 21.581 }
{ "location" : { "country" : "India", "continent" : "Asia" }, "name" : "Delhi", "population" : 28.514 }
{ "location" : { "country" : "Argentina", "continent" : "South America" }, "name" : "Buenos Aires", "population" : 14.967 }
{ "location" : { "country" : "India", "continent" : "Asia" }, "name" : "Kolkata", "population" : 14.681 }
{ "location" : { "country" : "United States", "continent" : "North America" }, "name" : "New York", "population" : 18.819 }
{ "location" : { "country" : "Philippines", "continent" : "Asia" }, "name" : "Manila", "population" : 13.482 }
{ "location" : { "country" : "China", "continent" : "Asia" }, "name" : "Chongqing", "population" : 14.838 }
{ "location" : { "country" : "Turkey", "continent" : "Europe" }, "name" : "Istanbul", "population" : 14.751 }
各ドキュメントは、投影段階で変換された新しい形式に従います。
使い方を学んだので $project
集約パイプラインを通過するドキュメントの新しいドキュメント構造を構築するステージがあれば、このガイド全体でカバーされているすべてのパイプラインステージを単一の集約パイプラインに結合する準備が整います。
ステップ6—すべてのステージをまとめる
これで、前の手順で使用して練習したすべてのステージを結合して、ドキュメントのフィルタリングと変換の両方を行う完全に機能する集計パイプラインを形成する準備が整いました。
手元のタスクが、アジアと北アメリカの国の各国で最も人口の多い都市を見つけて、その名前と人口の両方を返すことであると仮定します。 結果は、人口が最も多い国から順に並べ替える必要があります。最も人口の多い都市が2,000万人のしきい値を超える国にのみ関心があります。 最後に、目的のドキュメント構造は次のように複製する必要があります。
{
"location" : {
"country" : "Japan",
"continent" : "Asia"
},
"most_populated_city" : {
"name" : "Tokyo",
"population" : 37.4
}
}
これらの要件を満たすデータセットを取得する方法を説明するために、この手順では、適切な集計パイプラインを構築する方法の概要を説明します。
次のクエリを実行することから始めます。このクエリは、 cities
コレクションなので、結果セットにはアジアと北アメリカの国のみが含まれます。 後でドキュメントの選択を絞り込むことは可能ですが、事前に行うことでパイプラインの効率が最適化されます。 結局のところ、早期に処理するドキュメントの数を制限すると、後の段階で必要な処理の量を最小限に抑えることができます。
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- }
- ])
このパイプラインの $match
stageは、北米とアジアの都市のみを検索し、これらの都市を表すドキュメントは、完全な元の構造で、デフォルトの順序で返されます。
Output{ "_id" : ObjectId("612d1e835ebee16872a109a4"), "name" : "Seoul", "country" : "South Korea", "continent" : "Asia", "population" : 25.674 }
{ "_id" : ObjectId("612d1e835ebee16872a109a5"), "name" : "Mumbai", "country" : "India", "continent" : "Asia", "population" : 19.98 }
{ "_id" : ObjectId("612d1e835ebee16872a109a7"), "name" : "Beijing", "country" : "China", "continent" : "Asia", "population" : 19.618 }
{ "_id" : ObjectId("612d1e835ebee16872a109a8"), "name" : "Shanghai", "country" : "China", "continent" : "Asia", "population" : 25.582 }
. . .
ステップ4では、グループ内の最初のドキュメントのフィールドにアクセスする必要がある場合、ドキュメントの順序付けされていないリストをグループ化ステージに渡すと、予期しない結果が生じる可能性があることを学びました。 後で最も人口の多い都市の名前を見つけるためにこれを行う必要があるため、この問題を回避するには、次の手順に従って都市を人口の多いものから少ないものの順に並べることができます。 $match
ステージ $sort
ステージ:
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- },
- {
- $sort: { "population": -1 }
- }
- ])
この第2パイプラインステージ aggregate()
メソッドは、MongoDBに、ドキュメントを人口の降順で並べ替えるように指示します。 { "population": -1 }
ドキュメントの並べ替え。
ここでも、返送されたドキュメントは同じ構造ですが、人口が最も多い東京が最初になります。
Output{ "_id" : ObjectId("612d1e835ebee16872a109ab"), "name" : "Tokyo", "country" : "Japan", "continent" : "Asia", "population" : 37.4 }
. . .
これで、予想される大陸からの人口でソートされた都市のリストができたので、このシナリオで次に必要なアクションは、各グループから最も人口の多い都市のみを選択して、国ごとに都市をグループ化することです。 これを行うには、を追加します $group
パイプラインへのステージ:
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- },
- {
- $sort: { "population": -1 }
- },
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- },
- "first_city": { $first: "$name" },
- "highest_population": { $max: "$population" }
- }
- }
- ])
この新しいステージのグループ化式は、MongoDBに、固有の大陸と国のペアで都市をグループ化するように指示します。 グループごとに、2つの計算値がグループを要約します。 The highest_population
値は $max
グループ内で最も高い母集団を見つけるためのアキュムレータ演算子。 The first_city
ドキュメントのグループの最初の都市の名前を取得します。 以前に適用された並べ替え段階のおかげで、この最初の都市がグループ内で最も人口の多い都市でもあり、人口の数値と一致することを確認できます。
これを追加する $group
stageは、このメソッドによって返されるドキュメントの数とその構造を変更します。 今回は、以前にフィルタリングされた都市リストに9つの固有の国と大陸のペアしかないため、このメソッドは9つのドキュメントのみを返します。 各ドキュメントは、これらのペアの1つに対応し、グループ化式の値で構成されます。 _id
フィールドと2つの計算フィールド:
Output{ "_id" : { "continent" : "North America", "country" : "United States" }, "first_city" : "New York", "highest_population" : 18.819 }
{ "_id" : { "continent" : "Asia", "country" : "China" }, "first_city" : "Shanghai", "highest_population" : 25.582 }
{ "_id" : { "continent" : "Asia", "country" : "Japan" }, "first_city" : "Tokyo", "highest_population" : 37.4 }
{ "_id" : { "continent" : "Asia", "country" : "South Korea" }, "first_city" : "Seoul", "highest_population" : 25.674 }
{ "_id" : { "continent" : "Asia", "country" : "Bangladesh" }, "first_city" : "Dhaka", "highest_population" : 19.578 }
{ "_id" : { "continent" : "Asia", "country" : "Philippines" }, "first_city" : "Manila", "highest_population" : 13.482 }
{ "_id" : { "continent" : "Asia", "country" : "India" }, "first_city" : "Delhi", "highest_population" : 28.514 }
{ "_id" : { "continent" : "Asia", "country" : "Pakistan" }, "first_city" : "Karachi", "highest_population" : 15.4 }
{ "_id" : { "continent" : "North America", "country" : "Mexico" }, "first_city" : "Mexico City", "highest_population" : 21.581 }
各グループの結果のドキュメントは、母集団の値で並べ替えられていないことに注意してください。 ニューヨークが最初ですが、2番目の都市である上海には700万人近くの人口があります。 また、いくつかの国では、最も人口の多い都市が予想されるしきい値である2,000万を下回っています。
フィルタリングと並べ替えの段階は、パイプラインに複数回表示される可能性があることに注意してください。 また、各集約ステージでは、最後のステージの出力が次のステージの入力になります。 別のものを使用する $match
人口が2,000万人以上の都市を持つ国のみを含むようにグループをフィルタリングする段階:
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- },
- {
- $sort: { "population": -1 }
- },
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- },
- "first_city": { $first: "$name" },
- "highest_population": { $max: "$population" }
- }
- },
- {
- $match: {
- "highest_population": { $gt: 20.0 }
- }
- }
- ])
このフィルタリング $match
ステージとは highest_population
このようなフィールドは元のドキュメントの構造の一部ではありませんが、グループ化段階からのドキュメントで使用可能なフィールド。
今回は、5つの国が出力に表示されます。
Output{ "_id" : { "continent" : "Asia", "country" : "China" }, "first_city" : "Shanghai", "highest_population" : 25.582 }
{ "_id" : { "continent" : "Asia", "country" : "Japan" }, "first_city" : "Tokyo", "highest_population" : 37.4 }
{ "_id" : { "continent" : "Asia", "country" : "South Korea" }, "first_city" : "Seoul", "highest_population" : 25.674 }
{ "_id" : { "continent" : "Asia", "country" : "India" }, "first_city" : "Delhi", "highest_population" : 28.514 }
{ "_id" : { "continent" : "North America", "country" : "Mexico" }, "first_city" : "Mexico City", "highest_population" : 21.581 }
次に、結果を次の順序で並べ替えます highest_population
価値。 これを行うには、別の $sort
ステージ:
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- },
- {
- $sort: { "population": -1 }
- },
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- },
- "first_city": { $first: "$name" },
- "highest_population": { $max: "$population" }
- }
- },
- {
- $match: {
- "highest_population": { $gt: 20.0 }
- }
- },
- {
- $sort: { "highest_population": -1 }
- }
- ])
ドキュメント構造は変更されず、MongoDBは国グループに対応する5つのドキュメントを返します。 ただし、今回は、東京がデータセットの中で最も人口の多い都市であるため、日本が最初に表示されます。
Output{ "_id" : { "continent" : "Asia", "country" : "Japan" }, "first_city" : "Tokyo", "highest_population" : 37.4 }
{ "_id" : { "continent" : "Asia", "country" : "India" }, "first_city" : "Delhi", "highest_population" : 28.514 }
{ "_id" : { "continent" : "Asia", "country" : "South Korea" }, "first_city" : "Seoul", "highest_population" : 25.674 }
{ "_id" : { "continent" : "Asia", "country" : "China" }, "first_city" : "Shanghai", "highest_population" : 25.582 }
{ "_id" : { "continent" : "North America", "country" : "Mexico" }, "first_city" : "Mexico City", "highest_population" : 21.581 }
最後の要件は、前に示したサンプルと一致するようにドキュメント構造を変換することです。 あなたのレビューのために、ここにもう一度そのサンプルがあります:
{
"location" : {
"country" : "Japan",
"continent" : "Asia"
},
"most_populated_city" : {
"name" : "Tokyo",
"population" : 37.4
}
}
このサンプルの location
埋め込まれたドキュメントはに似ています _id
両方に含まれる式の値のグループ化 country
と continent
田畑。 最も人口の多い都市名と人口は、下に埋め込みドキュメントとしてネストされています most_populated_city
分野。 これは、すべての計算フィールドが最上位フィールドであるグループ化の結果とは異なります。
この構造に合わせて結果を変換するには、 $project
パイプラインへのステージ:
- db.cities.aggregate([
- {
- $match: {
- "continent": { $in: ["North America", "Asia"] }
- }
- },
- {
- $sort: { "population": -1 }
- },
- {
- $group: {
- "_id": {
- "continent": "$continent",
- "country": "$country"
- },
- "first_city": { $first: "$name" },
- "highest_population": { $max: "$population" }
- }
- },
- {
- $match: {
- "highest_population": { $gt: 20.0 }
- }
- },
- {
- $sort: { "highest_population": -1 }
- },
- {
- $project: {
- "_id": 0,
- "location": {
- "country": "$_id.country",
- "continent": "$_id.continent",
- },
- "most_populated_city": {
- "name": "$first_city",
- "population": "$highest_population"
- }
- }
- }
- ])
これ $project
ステージは最初に抑制します _id
フィールドが出力に表示されないようにします。 次に、を作成します location
2つのフィールドを含むネストされたドキュメントとしてのフィールド: country
と continent
. ドル記号表記を使用して、これらの各フィールドは入力ドキュメントからの値を参照します。 "$_id.country"
から値を取得します country
内側からのフィールド _id
入力の埋め込みドキュメント、および $_id.continent
そのから値を引き出します continent
分野。 most_populated_city
同様の構造に従い、ネストします name
と population
内部のフィールド。 これらはトップレベルのフィールドを参照します first_city
と highest_population
、 それぞれ。
この投影ステージは、出力のまったく新しい構造を効果的に構築します。これは次のとおりです。
Output{ "location" : { "country" : "Japan", "continent" : "Asia" }, "most_populated_city" : { "name" : "Tokyo", "population" : 37.4 } }
{ "location" : { "country" : "India", "continent" : "Asia" }, "most_populated_city" : { "name" : "Delhi", "population" : 28.514 } }
{ "location" : { "country" : "South Korea", "continent" : "Asia" }, "most_populated_city" : { "name" : "Seoul", "population" : 25.674 } }
{ "location" : { "country" : "China", "continent" : "Asia" }, "most_populated_city" : { "name" : "Shanghai", "population" : 25.582 } }
{ "location" : { "country" : "Mexico", "continent" : "North America" }, "most_populated_city" : { "name" : "Mexico City", "population" : 21.581 } }
この出力は、このステップの最初に定義されたすべての要件を満たしています。
- リストにはアジアと北米の都市のみが含まれます。
- 国と大陸のペアごとに1つの都市が選択され、人口が最も多い都市です。
- 選択した都市の名前と人口が一覧表示されます。
- 都市は、人口の多いものから少ないものへと並べ替えられます。
- 出力形式は、サンプルドキュメントに合わせて変更されます。
結論
この記事では、フィルタリング、並べ替え、要約、変換などのマルチステップドキュメント処理のためのMongoDB機能である集計パイプラインについて理解しました。 使用した $match
, $sort
, $group
、 と $project
集約は、集約されたデータを提示するために入力ドキュメントを処理するサンプルレポートシナリオを実行するために、1つずつ共同でステージングします。 また、ドキュメントのグループから最大値と合計を見つけるための計算フィールドとアキュムレータ演算子についても理解しました。
このチュートリアルでは、データを処理および変換するためにMongoDBが提供する集約パイプライン機能のごく一部についてのみ説明します。 利用可能な処理ステージは他にもあり、この記事で説明する各ステージは、追加のさまざまな方法で使用できます。 公式の公式のMongoDBドキュメントを調べて、集約パイプラインと、データベースに格納されているデータの操作にどのように役立つかについて学ぶことをお勧めします。