$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 を使用します。
重要な注意点:
原則として、同一のオブジェクト内で 0 と 1 を混在させて使用することはできません。唯一の例外は _id フィールドです。
基本的には、「含めたいフィールドのみを指定する」か「除外したいフィールドのみを指定する」かのどちらか一方を選択して記述する必要があります。
3.1 特定のフィールドを除外する例
たとえば、cuisine フィールドだけを結果から除きたい場合は以下のように記述します。この場合、他のすべてのフィールドは結果に含まれます。
db.restaurants.aggregate([
{
$project: {
"cuisine": 0
}
}
])