$project (射影)
最終更新:2026-10-09
$project (射影)
$project は射影ステージです。フィールドの選択・除外・新規計算を行い、各ドキュメントを新しい形に変換します。$addFields と違い、デフォルトでは _id と明示したフィールドだけを出力します: 1 は含める、0 は除外、式は新しいフィールドを作成します。ドキュメントの圧縮、フィールド名の変更、埋め込みオブジェクトの平坦化に使います。包含と除外は混在できません(_id を除く)。
| カテゴリ | コアステージ |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $project: { <field>: <1 or 0 or expression>, ... } }
⚙️ パラメータ
| フィールド射影 | フィールド名を 1(含める)、0(除外する)、または集計式(計算フィールド)にマッピングします。 |
|---|
戻り値:射影されたドキュメントストリーム
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $project: name を保持し、total を計算
db.orders.aggregate([
{ $project: { _id: 0, name: 1, total: { $multiply: ['$price', '$qty'] } } }
])
出力:
// 各ドキュメントは name と total だけになる
{ "name": "Pen", "total": 150 }
{ "name": "Book", "total": 30 }
📌 注意事項
- $project はホワイトリスト: 指定していないフィールドは削除される
- 包含と除外は混在できない(_id を除く)
- 'detail.price' のようなドットパスで埋め込みフィールドをリネーム・平坦化できる
🏷️ 関連タグ
💡 関連ケース
高度な集計パイプライン:複雑な式と変換
集計パイプライン入門:aggregateメソッドと基本ステージ
ブログコメントシステムCRUD実践
Change Streams:リアルタイム変更監視
$facet + $bucket + テキスト/地理空間検索
$lookupと複数コレクションの関連付け
📚 関連チュートリアル
❓ よくある質問
Q$project と $addFields の違いは?
A$addFields は元のフィールドをすべて保持して新フィールドを追加します。$project はデフォルトで指定外のフィールドを落とし、ドキュメントの整形・再構築に使います。
Q$project で複数フィールドを同時に除外できますか?
Aはい。すべて 0 にします。たとえば { $project: { secret: 0, log: 0 } } とすると、他のフィールドはすべて保持されます。
Q$project はフィールドの順序を変えますか?
A出力フィールドは射影に書いた順序になり、元のドキュメントの順序には依存しません。