返すフィールドを指定する
Overview
プロジェクションを使用して、読み取り操作によって返されるドキュメントにどのフィールドが表示されるかを制御します。多くのリクエストは特定のフィールドのみを必要とするため、プロジェクションは不要なネットワーク帯域幅の使用を制限するのに役立ちます。プロジェクションは、次の 2 つの方法で機能します。
値が
1
のフィールドを明示的に含めます。これには、指定されていないすべてのフィールドを暗黙的に除外するという副作用があります。値が
0
のフィールドを暗黙的に除外します。これには、指定されていないすべてのフィールドが暗黙的に含まれるという副作用があります。
これらの 2 つのプロジェクション方法は相互に排他的です。つまり、フィールドを明示的に含める場合は、フィールドを明示的に除外することはできません。また、その逆も同様です。
サンプル ドキュメント
このガイドの例えに従うには、次のコード スニペットを使用して、完了を説明するドキュメントをmyDB.fruits
コレクションに挿入します。
const myDB = client.db("myDB"); const myColl = myDB.collection("fruits"); await myColl.insertMany([ { "_id": 1, "name": "apples", "qty": 5, "rating": 3 }, { "_id": 2, "name": "bananas", "qty": 7, "rating": 1 }, { "_id": 3, "name": "oranges", "qty": 6, "rating": 2 }, { "_id": 4, "name": "avocados", "qty": 3, "rating": 5 }, ]);
注意
クエリ操作により、一致するドキュメントを含むカーソルへの参照が返される場合があります。 カーソルに保存されているデータを調べる方法については、「 カーソルの基礎ページ 」を参照してください。
シングル フィールド
次のクエリでは、各ドキュメントの name
フィールドのみを返すようにプロジェクションを渡します。
// return only* the name field const projection = { name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
プロジェクション ドキュメントでは、name
に 1
の値が指定されています。これは、返された各ドキュメントの name
フィールドを結果に含めるように操作に指示し、qty
フィールドと rating
フィールドを除外するようにします。このプロジェクションを find()
に渡すと、クエリ ドキュメントは空で、ソートドキュメントは指定しない状態で、次の結果が得られます。
{ "_id": 1, "name": "apples" } { "_id": 2, "name": "bananas" } { "_id": 3, "name": "oranges" } { "_id": 4, "name": "avocados" }
このプロジェクションには name
フィールドのみが明示的に含まれていましたが、クエリは _id
フィールドも返しました。
_id
フィールドは、明示的に指定されない限り、すべてのクエリに常に含まれるため、特別なケースです。これは、_id
が各ドキュメントのユニークな識別子であり、クエリの構築時によく使用されるプロパティであるためです。movies
コレクション データは、このプロパティが必要な理由を示しています。映画のリメイクなど、2 つ以上の映画が同じタイトルを共有する場合があります。このため、特定の映画を確実に参照するには、ユニークな _id
値が必要です。_id
は、プロジェクションにおける相互に排他的な包含や除外動作の唯一の例外です。返されるドキュメントに _id
が存在しないようにしたい場合は、他のフィールドを明示的に含める場合でも、_id
を明示的に除外できます。
// return only the name field const projection = { _id: 0, name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
プロジェクション ドキュメントでは、name
に 1
の値が指定され、_id
に 0
の値が指定されています。これは、返された各ドキュメントの name
フィールドを結果に含め、_id
、qty
、および rating
フィールドを除外するように指示します。このプロジェクションを空のクエリ ドキュメントとソート ドキュメントなしで find()
に渡すと、次の結果が得られます。
{ "name": "apples" } { "name": "bananas" } { "name": "oranges" } { "name": "avocados" }
複数のフィールド
また、プロジェクションに含めるフィールドを複数指定することもできます。注記: プロジェクションでフィールドを指定する順序によって、返される順序は変更されません。
const projection = { _id: 0, rating: 1, name: 1 }; const cursor = myColl.find().project(projection); for await (const doc of cursor) { console.dir(doc); }
プロジェクションに含める 2 つのフィールドを識別するこの例では、次の結果が得られます。
{ "name": "apples", "rating": 3 } { "name": "bananas", "rating": 1 } { "name": "oranges", "rating": 2 } { "name": "avocados", "rating": 5 }
その他のプロジェクション例については、「クエリから返されるプロジェクト フィールドに関する MongoDB マニュアル ページ」を参照してください。