MongoDB 速習チュートリアル

$project

1. $project ステージの概要

このアグリゲーションステージは、指定されたフィールドのみを次のアグリゲーションステージへと渡します。
これは、find() メソッドで使用されるプロジェクション(投影)と同じ仕組みです。

後続のステージに必要なデータのみを絞り込むことで、メモリ使用量を抑え、パイプラインの処理効率を向上させることができます。

2. 使用例

この例では、「アグリゲーション入門」セクションでロードしたサンプルデータセットの中から、sample_restaurants データベースを使用します。

2.1 コード例:特定フィールドの抽出と取得件数の制限

db.restaurants.aggregate([
  {
    // ステージ 1: name, cuisine, address フィールドのみを抽出
    $project: {
      "name": 1,
      "cuisine": 1,
      "address": 1
    }
  },
  {
    // ステージ 2: 結果を 5 件に制限
    $limit: 5
  }
])

このクエリを実行すると、ドキュメントが返されますが、そこには指定したフィールドのみが含まれます。

3. フィールドの包含と除外のルール

結果に _id フィールドが含まれていることに注目してください。このフィールドは、明示的に除外(0 を指定)しない限り、デフォルトで常に含まれます。

フィールドを含めるには 1 を、除外するには 0 を使用します。

重要な注意点:
原則として、同一のオブジェクト内で 01 を混在させて使用することはできません。唯一の例外は _id フィールドです。
基本的には、「含めたいフィールドのみを指定する」か「除外したいフィールドのみを指定する」かのどちらか一方を選択して記述する必要があります。

3.1 特定のフィールドを除外する例

たとえば、cuisine フィールドだけを結果から除きたい場合は以下のように記述します。この場合、他のすべてのフィールドは結果に含まれます。

db.restaurants.aggregate([
  {
    $project: {
      "cuisine": 0
    }
  }
])