MongoDB で集計パイプラインを使用する方法

MongoDB で集計パイプラインを使用する方法
あなたのような読者が MUO をサポートします。当社サイトのリンクを使用して商品を購入すると、アフィリエイト手数料が発生する場合があります。 続きを読む。

集約パイプラインは、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 が各集約段階でスキャンする必要があるデータの量が制限されます。