반환할 필드 지정
개요
프로젝션을 사용하여 읽기 작업으로 반환된 문서에 표시되는 필드를 제어합니다. 대부분의 요청에는 특정 필드만 필요하므로 프로젝션을 사용하면 불필요한 네트워크 대역폭 사용을 제한할 수 있습니다. 프로젝션은 두 가지 방식으로 작동합니다:
값이
1
인 필드를 명시적으로 포함합니다. 이렇게 하면 지정되지 않은 모든 필드가 암시적으로 제외되는 부작용이 있습니다.값이
0
인 필드를 암시적으로 제외합니다. 이렇게 하면 지정되지 않은 모든 필드가 암시적으로 포함되는 부작용이 있습니다.
이 두 가지 프로젝션 방법은 상호 배타적입니다. 필드를 명시적으로 포함하는 경우 필드를 명시적으로 제외할 수 없으며 그 반대의 경우도 마찬가지입니다.
샘플 문서
이 가이드의 예시를 따라 하려면 다음 코드 스니펫을 사용하여 과일을 설명하는 문서를 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
컬렉션은 이 속성이 왜 유용한지를 보여주는 좋은 예입니다. 리메이크나 별도 작품에서 같은 영화 제목을 사용하는 경우가 있기 때문에 특정 영화를 가려내려면 고유한 _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); }
프로젝션에 포함할 두 개의 필드를 식별하는 이 예시는 다음과 같은 결과를 산출합니다.
{ "name": "apples", "rating": 3 } { "name": "bananas", "rating": 1 } { "name": "oranges", "rating": 2 } { "name": "avocados", "rating": 5 }
추가 프로젝션 예제는 MongoDB 매뉴얼 페이지의 쿼리에서 반환할 프로젝트 필드를 참조하세요.