MongoDB에서 컬렉션의 전체 문서가 아닌 특정 필드만 가져오고 싶다면 find() 메서드에 프로젝션(projection)을 사용하면 됩니다. 프로젝션은 쿼리 결과에 포함할 필드(1)와 제외할 필드(0)를 지정하는 기능으로, 불필요한 데이터 전송을 줄여 쿼리 성능을 높일 수 있습니다.
1. 테스트용 컬렉션 생성
먼저 예제에 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.specificFieldDemo.insertOne({"FirstName":"John","LastName":"Doe"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb8019a623186894665ae31")
}
> db.specificFieldDemo.insertOne({"FirstName":"John","LastName":"Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb801ab623186894665ae32")
}
> db.specificFieldDemo.insertOne({"FirstName":"David","LastName":"Miller"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb801b3623186894665ae33")
}
> db.specificFieldDemo.insertOne({"FirstName":"Sam","LastName":"Williams"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cb801bf623186894665ae34")
}2. 전체 문서 조회하기
find() 메서드를 사용해 컬렉션의 모든 문서를 확인해 보겠습니다.
> db.specificFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같이 모든 필드가 포함된 문서가 출력됩니다.
{
"_id" : ObjectId("5cb8019a623186894665ae31"),
"FirstName" : "John",
"LastName" : "Doe"
}
{
"_id" : ObjectId("5cb801ab623186894665ae32"),
"FirstName" : "John",
"LastName" : "Smith"
}
{
"_id" : ObjectId("5cb801b3623186894665ae33"),
"FirstName" : "David",
"LastName" : "Miller"
}
{
"_id" : ObjectId("5cb801bf623186894665ae34"),
"FirstName" : "Sam",
"LastName" : "Williams"
}3. 특정 필드만 반환하기
이번에는 LastName 필드만 조회해 보겠습니다. 두 번째 인자로 프로젝션 객체를 전달하며, 여기서 _id: 0은 _id 필드를 제외하겠다는 의미이고, LastName: 1은 해당 필드를 포함하겠다는 의미입니다.
> db.specificFieldDemo.find({},{_id:0,LastName:1});실행 결과는 다음과 같습니다.
{ "LastName" : "Doe" }
{ "LastName" : "Smith" }
{ "LastName" : "Miller" }
{ "LastName" : "Williams" }프로젝션 사용 시 주의할 점
- _id는 기본적으로 항상 포함됩니다. 따라서
_id필드가 필요 없다면 반드시_id: 0으로 명시적으로 제외해야 합니다. - 포함(1) 방식을 사용할 경우, 지정한 필드 외에는 모두 제외되며
_id만 예외적으로 기본 포함됩니다. - 반대로 제외(0) 방식을 사용하면 지정한 필드만 빠지고 나머지 필드가 모두 반환됩니다.
- 단, 하나의 프로젝션 객체에서
_id를 제외하고는 포함(1)과 제외(0)를 혼합해서 사용할 수 없습니다.
이처럼 MongoDB의 프로젝션을 활용하면 대용량 컬렉션에서도 꼭 필요한 데이터만 효율적으로 조회할 수 있어 네트워크 부담과 응답 시간을 크게 줄일 수 있습니다.