MongoDBアグリゲーションパイプラインの理解

私が作成したほとんどのREST APIでは、MongoDBを私の行きつけのNoSQLデータベースとして使用しています。MongoDBは、おそらく世界で最も人気のあるNoSQLデータベースです。
私の使用例では、さまざまなクエリでfind()コマンドを一般的に使用しています。しかし、複合クエリを書く必要がある最近のプロジェクトで、MongoDBのアグリゲーションについてもっと学ぶ必要があることに気がつきました。

この記事では、MongoDBのアグリゲーションパイプラインの主要なステージとその適用方法について説明します。

アグリゲーションパイプラインとは何ですか?


アグリゲーションは、大量のドキュメントを処理するために、さまざまなステージを経るプロセスです。これらのステージをパイプラインと呼びます。
MongoDBのアグリゲーションパイプラインにはいくつかのステージがあり、それぞれがドキュメントを変更します。つまり、アグリゲーションパイプラインは複数ステージのパイプラインであり、各ステージで入力として取られたドキュメントが結果セットのドキュメントに変換され、次のステージ(存在する場合)でその結果ドキュメントが入力として取られ出力を生成し、最後のステージまで続きます。

以下の画像は、MongoDBアグリゲーションパイプラインの動作方法を示しています。

アグリゲーションパイプラインのステージ


MongoDBアグリゲーションパイプラインにはいくつかのステージがあります。このセクションでは、よく使用されるステージをいくつか説明します。

  • $match - 指定された条件に一致するドキュメントのみを次のパイプラインステージに渡します。これは次のステージへの入力ドキュメントの量を減らすことができます。
    構文

    db.users.aggregate(
        [ { $match : { email : "example@gmail.com" } } ]
    );
    
  • $group - コレクションからドキュメントを「グループキー」に基づいてグループ化するために使用されます。
    構文

    db.sales.aggregate( [
      {
        $group: {
           _id: null,
           count: { $count: { } }
        }
      }
    ] )
    
  • $sort - このステージは、結果ドキュメント(昇順または降順)を並べ替えるために使用されます。
    構文

    db.contestants.aggregate(
       [
         { $sort : { votes : 1 } }
       ]
    )
    
  • $project - 結果として得られるコレクションからクライアントに送信される特定のフィールドを選択するために使用されます。
    構文

    db.events.aggregate(
       [
            $project: {
               _id: 0,
               name: 1,
               description: 1,
               banner: 1,
               opening_date: 1,
               closing_date: 1,
            },
       ]
    )
    
  • $lookup - 同じデータベース内のコレクションに左外部結合を実行し、「結合された」コレクションからのドキュメントをフィルタリングして処理するために使用されます。
    構文

    db.orders.aggregate( [
       {
         $lookup:
           {
             from: "inventory",
             localField: "item",
             foreignField: "sku",
             as: "inventory_docs"
           }
      }
    ] )
    
  • $unwind - 入力ドキュメントの配列フィールドを展開し、要素ごとにドキュメントを出力する。
    構文

    db.events.aggregate( [ { $unwind : "$organizer" } ] )
    

サンプルユースケース


このユースケースでは、EventsとそのOrganizersという2つのモデルまたはコレクションがあります。
各イベントドキュメントは、外部キーとしてのorganizer _idを持っています。
私はアグリゲーションパイプラインを使用して、ただのオーガナイザーIDではなく、そのオーガナイザーデータと一緒にイベントを取得しました。

このスニペットは、話し合われたステージの組み合わせを利用しています。

const events = await Event.aggregate([
      {
          $lookup: {
              from: "organizers",
              localField: "organizer",
              foreignField: "_id",
              as: "organizer",
          },
      },
      {
          $unwind: "$organizer",
      },
      {
          $project: {
              name: 1,
              description: 1,
              banner: 1,
              vote_price: 1,
              opening_date: 1,
              closing_date: 1,
              organizer: {
                  name: "$organizer.name",
                  email: "$organizer.email",
                  phone: "$organizer.phone",
                  company: "$organizer.company",
                  address: "$organizer.address",
              },
          },
      },
  ]);


  res.status(200).json({
      success: true,
      data: events,
      message: "Events fetched successfully",
  });

結論


MongoDBアグリゲーションパイプラインのいくつかのステージを例とともに説明しました。

MongoDBをより複雑なプロジェクトに使用するにつれて、アグリゲーションはAPIの不可欠な部分を形成する高度なクエリを実行するために避けられない概念になります。

ハッキングを楽しんでください!

🚀ここにBentilがいます。
今までにプロジェクトでアグリゲーションパイプラインを使ったことがありますか? どんな経験でしたか?コメントセクションでお聞かせいただければ幸いです。これは、まだプロジェクトでアグリゲーションを使用していない人にとって役立つでしょう。

このコンテンツが役に立つと思ったら、いいね、コメント、共有をしてください。

こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/qbentil/understanding-mongodb-aggregation-pipeline-3964