AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

クエリから返されるプロジェクト フィールド


➤ 右上の言語の選択ドロップダウンメニューを使用して、以下の例の言語を設定します。


➤ 右上の [言語選択] ドロップダウンメニューを使用して、以下の例の言語を設定するか、MongoDB Compass を選択します。


デフォルトでは、MongoDB のクエリは一致するドキュメント内のすべてのフィールドを返します。MongoDB がアプリケーションに送信するデータ量を制限するには、返されるフィールドを指定または制限するプロジェクション ドキュメントを含めることができます。

このページでは、 メソッドを使用した、プロジェクションにおけるdb.collection.find() mongoshでのクエリ操作の例を取り上げます。

db.inventory.insertMany( [
{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },
{ item: "notebook", status: "A", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },
{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },
{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },
{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

プロジェクションドキュメントを指定しない場合、db.collection.find() メソッドは一致するドキュメントのすべてのフィールドを返します。

次の例では、inventory コレクション内の status が "A" に等しいすべてのドキュメントのすべてのフィールドを返します。

db.inventory.find( { status: "A" } )

この操作は、次の SQL ステートメントに対応します。

SELECT * from inventory WHERE status = "A"

プロジェクション ドキュメントで <field> を 1 に設定することで、プロジェクションに複数のフィールドを明示的に含めることができます。次の操作は、クエリに一致するすべてのドキュメントを返します。結果のセットでは、item フィールド、status フィールド、デフォルトでは _id フィールドのみが一致するドキュメントに返されます。

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

この操作は、次の SQL ステートメントに対応します。

SELECT _id, item, status from inventory WHERE status = "A"

次の例のように、プロジェクションで _id フィールドを 0 に設定することで、結果からそのフィールドを除くことができます。

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

この操作は、次の SQL ステートメントに対応します。

SELECT item, status from inventory WHERE status = "A"

注意

_id フィールドを除き、プロジェクション ドキュメントに含むステートメントと除外するステートメントを組み合わせることはできません。

一致するドキュメントで返すフィールドを一覧表示する代わりに、プロジェクションを使用して特定のフィールドを除外できます。次の例では、一致するドキュメントの status フィールドと instock フィールドを除くすべてのフィールドが返されます。

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

注意

_id フィールドを除き、プロジェクション ドキュメントに含むステートメントと除外するステートメントを組み合わせることはできません。

埋め込みドキュメント内の特定のフィールドを返すことができます。ドット表記を使用して埋め込みフィールドを参照し、プロジェクション ドキュメントで 1 に設定します。

以下の例では、次の値が返されます。

  • _id フィールド(デフォルトで返されます)

  • item フィールド

  • status フィールド

  • size ドキュメントの uom フィールド

uom フィールドは size ドキュメントに埋め込まれたままになります。

db.inventory.find(
{ status: "A" },
{ item: 1, status: 1, "size.uom": 1 }
)

ネストされたフォームを使用して埋め込みフィールドを指定することもできます。たとえば、{ item: 1, status: 1, size: { uom: 1 } }などです。

埋め込みドキュメント内の特定のフィールドを非表示にできます。ドット表記を使用してプロジェクション ドキュメント内の埋め込みフィールドを参照し、0 に設定します。

次の例では、size ドキュメント内の uom フィールドを除外するプロジェクションを指定します。一致するドキュメントには、他のすべてのフィールドが返されます。

db.inventory.find(
{ status: "A" },
{ "size.uom": 0 }
)

ネストされたフォームを使用して埋め込みフィールドを指定することもできます。たとえば、{ size: { uom: 0 } }などです。

ドット表記を使用して、配列に埋め込まれたドキュメント内の特定のフィールドをプロジェクトします。

次の例では、返すプロジェクションを指定します。

  • _id フィールド(デフォルトで返されます)

  • item フィールド

  • status フィールド

  • instock 配列に埋め込まれたドキュメントの qty フィールド

db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

配列を含むフィールドの場合、MongoDB は、$elemMatch、$slice、$ の配列を操作するための次のプロジェクション演算子を提供します。

次の例では、$slice プロジェクション演算子を使用して、instock 配列の最後の要素を返します。

db.inventory.find( { status: "A" }, { item: 1, status: 1, instock: { $slice: -1 } } )

$elemMatch、$slice、および $ は、返される配列に含める特定の要素をプロジェクションする唯一の方法です。例えば、配列インデックスを使用して特定の配列要素をプロジェクションすることはできません。例えば、{ "instock.0": 1 } プロジェクションでは、最初の要素を含む配列はプロジェクションされません。

集計式はクエリ プロジェクションで指定できます。集計式により、新しいフィールドのプロジェクションや、既存フィールドの値の変更ができます。

たとえば、次の操作では、集計式を使用して status フィールドの値を上書きし、新しいフィールド area と reportNumber のプロジェクションをします。

注意

次の例ではMongoDB Shell構文を使用します。集計を使用したプロジェクションのドライバーの例については、 ドライバーのドキュメント を参照してください。

db.inventory.find(
{ },
{
_id: 0,
item: 1,
status: {
$switch: {
branches: [
{
case: { $eq: [ "$status", "A" ] },
then: "Available"
},
{
case: { $eq: [ "$status", "D" ] },
then: "Discontinued"
},
],
default: "No status found"
}
},
area: {
$concat: [
{ $toString: { $multiply: [ "$size.h", "$size.w" ] } },
" ",
"$size.uom"
]
},
reportNumber: { $literal: 1 }
}
)
[
{
item: 'journal',
status: 'Available',
area: '294 cm',
reportNumber: 1
},
{
item: 'planner',
status: 'Discontinued',
area: '685.5 cm',
reportNumber: 1
},
{
item: 'notebook',
status: 'Available',
area: '93.5 in',
reportNumber: 1
},
{
item: 'paper',
status: 'Discontinued',
area: '93.5 in',
reportNumber: 1
},
{
item: 'postcard',
status: 'Available',
area: '152.5 cm',
reportNumber: 1
}
]
  • $project集計ステージを使用する場合、それは通常パイプラインの 最後のステージ であり、クライアントに返すフィールドを指定するために使用されます。

    $project ステージをパイプラインの開始または中間で使用して、後続のパイプラインステージに渡されるフィールドの数を減らしてもパフォーマンスが改善する可能性はほとんどありません。データベースではこの最適化が自動的に実行されているためです。

  • MongoDB は、プロジェクションに関して追加の制限を適用します。詳細については、「プロジェクションの制限」を参照してください。