Docs Menu
Docs Home
/ / /
Node.js
/ / /

返すフィールドを指定する

項目一覧

  • 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);
}

プロジェクション ドキュメントでは、name1 の値が指定されています。これは、返された各ドキュメントの 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コレクションは、このプロパティが有用な理由を示す良い例です。リメイクや別個の作業でも映画のタイトルを再利用することがあるため、特定の映画を参照するには一意の_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);
}

プロジェクション ドキュメントでは、name1 の値が指定され、_id0 の値が指定されています。これは、返された各ドキュメントの name フィールドを結果に含め_idqty、および 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 マニュアル ページ 」を参照してください。

戻る

返される結果の数を制限する