集約パイプラインは、MongoDB で複雑なクエリを実行する場合に推奨される方法です。 MongoDB の MapReduce を使用している場合は、より効率的な計算を行うために、集計パイプラインに切り替えることをお勧めします。
今日のMUOビデオ スクロールしてコンテンツを続けてください
MongoDB の集約とは何ですか?また、どのように機能しますか?
集約パイプラインは、高度な実行のための複数段階のプロセスです。 MongoDB のクエリ 。パイプラインと呼ばれるさまざまなステージを通じてデータを処理します。あるレベルから生成された結果を別のレベルの操作テンプレートとして使用できます。
たとえば、一致操作の結果を別のステージに渡し、目的の出力が得られるまでその順序で並べ替えることができます。
集約パイプラインの各ステージは MongoDB オペレーターを特徴とし、1 つ以上の変換されたドキュメントを生成します。クエリによっては、レベルがパイプライン内で複数回出現する場合があります。たとえば、次のようなものを使用する必要があるかもしれません。 $count または $sort オペレーターは、集約パイプライン全体で複数回ステージングします。
集約パイプラインの段階
集約パイプラインは、単一のクエリで複数のステージを通じてデータを渡します。いくつかの段階があり、その詳細については、 MongoDB ドキュメント 。
どこで紙を印刷できますか
以下で最も一般的に使用されるもののいくつかを定義しましょう。
$match ステージ
このステージは、他の集計ステージを開始する前に、特定のフィルタリング条件を定義するのに役立ちます。これを使用して、集計パイプラインに含める一致するデータを選択できます。
$group ステージ
グループ ステージでは、キーと値のペアを使用して、特定の基準に基づいてデータをさまざまなグループに分類します。各グループは出力ドキュメント内のキーを表します。
たとえば、次のことを考えてみましょう 販売 サンプルデータ:
集計パイプラインを使用すると、各製品セクションの合計販売数と上位売上を計算できます。
{
$group: {
_id: $Section,
total_sales_count: {$sum : $Sold},
top_sales: {$max: $Amount},
}
}
の _id: $セクション ペアは、セクションに基づいて出力ドキュメントをグループ化します。を指定することで、 top_sales_count そして トップセールス フィールドでは、MongoDB はアグリゲーターによって定義された操作に基づいて新しいキーを作成します。これはありえます $sum 、 $分 、 $max 、 または 平均$ 。
$skip ステージ
使用できます $スキップ ステージを使用して、出力内の指定された数のドキュメントを省略します。通常はグループステージ後に行われます。たとえば、2 つの出力ドキュメントが予期されているが 1 つをスキップした場合、集計は 2 番目のドキュメントのみを出力します。
スキップステージを追加するには、 $スキップ 集約パイプラインへの操作:
...,
{
$skip: 1
},
$sort ステージ
並べ替えステージでは、データを降順または昇順に並べることができます。たとえば、前のクエリ例のデータを降順でさらに並べ替えて、どのセクションの売上が最も高いかを判断できます。
を追加します。 $sort 前のクエリに対する演算子:
...,
{
$sort: {top_sales: -1}
},
$limit ステージ
制限操作は、集計パイプラインで表示する出力ドキュメントの数を減らすのに役立ちます。たとえば、 $limit 演算子は、前のステージで返された売上が最も高いセクションを取得します。
...,
{
$sort: {top_sales: -1}
},
{"$limit": 1}
上記は最初のドキュメントのみを返します。これは、並べ替えられた出力の上部に表示されるため、最も売上が高いセクションです。
$project ステージ
の $プロジェクト stage を使用すると、出力ドキュメントを自由に整形できます。の使用 $プロジェクト 演算子を使用すると、出力に含めるフィールドを指定し、そのキー名をカスタマイズできます。
たとえば、 $プロジェクト ステージは次のようになります:
でどのようになるかを見てみましょう $プロジェクト ステージ。追加するには、 $プロジェクト パイプラインに:
痛みは車自体を愛する主な理由です。英語で
...,
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
以前に製品セクションに基づいてデータをグループ化したため、上記の出力ドキュメントには各製品セクションが含まれています。また、集計された売上数と上位売上高が出力に含まれることも保証します。 合計販売額 そして トップセール 。
最終的な出力は、以前のものと比べてかなりきれいになっています。
$unwind ステージ
の $unwind stage は、ドキュメント内の配列を個々のドキュメントに分割します。以下を取得してください 注文 データ、たとえば:
使用 $unwind を解体するステージ アイテム 他の集計ステージを適用する前に配列を作成します。たとえば、 アイテム 各製品の合計収益を計算したい場合、配列は意味があります。
db.Orders.aggregate(
[
{
"$unwind": "$items"
},
{
"$group": {
"_id": "$items.product",
"total_revenue": { "$sum": { "$multiply": ["$items.quantity", "$items.price"] } }
}
},
{
"$sort": { "total_revenue": -1 }
},
{
"$project": {
"_id": 0,
"Product": "$_id",
"TotalRevenue": "$total_revenue",
}
}
])
上記の集計クエリの結果は次のとおりです。
MongoDB で集計パイプラインを作成する方法
集計パイプラインにはいくつかの操作が含まれていますが、前に紹介したステージでは、それぞれの基本的なクエリを含め、それらをパイプラインに適用する方法を理解できます。
以前のものを使用する 販売 データ サンプルでは、集約パイプラインをより広く見るために、上で説明したいくつかのステージを 1 つにまとめてみましょう。
db.sales.aggregate([
{
"$match": {
"Sold": { "$gte": 5 }
}
},
{
"$group": {
"_id": "$Section",
"total_sales_count": { "$sum": "$Sold" },
"top_sales": { "$max": "$Amount" },
}
},
{
"$sort": { "top_sales": -1 }
},
{"$skip": 0},
{
"$project": {
"_id": 0,
"Section": "$_id",
"TotalSold": "$total_sales_count",
"TopSale": "$top_sales",
}
}
])
最終的な出力は、以前に見たものと同じようになります。
通知が届かないのはなぜですか
集約パイプラインと MapReduce
MongoDB 5.0 以降で非推奨になるまで、MongoDB でデータを集約する従来の方法は MapReduce を使用していました。それでも MapReduce には幅広い用途があります MongoDB を超えると、集約パイプラインよりも効率が低く、マップを作成して機能を個別に減らすためにサードパーティのスクリプトが必要になります。
一方、集約パイプラインは MongoDB のみに固有です。ただし、複雑なクエリを実行するためのよりクリーンで効率的な方法が提供されます。シンプルさとクエリのスケーラビリティに加えて、特徴的なパイプライン ステージにより出力がよりカスタマイズ可能になります。
他にもたくさんあります 集約パイプラインと MapReduce の違い 。 MapReduce から集約パイプラインに切り替えると、それらが表示されます。
MongoDB でビッグデータ クエリを効率化する
MongoDB 内の複雑なデータに対して詳細な計算を実行する場合、クエリは可能な限り効率的である必要があります。集約パイプラインは高度なクエリに最適です。データを個別の操作で操作するとパフォーマンスが低下することがよくありますが、集計を使用すると、すべてのデータを単一のパフォーマンスの高いパイプライン内にまとめて 1 回で実行できます。
集計パイプラインは MapReduce よりも効率的ですが、データにインデックスを付けることで、集計をより高速かつ効率的に行うことができます。これにより、MongoDB が各集約段階でスキャンする必要があるデータの量が制限されます。