MongoDB에서 쿼리 결과로 반환되는 데이터를 제한하려면 find() 메서드에 프로젝션(projection)을 사용하면 됩니다. 각 필드에 대해 1을 지정하면 해당 필드가 표시되고, 0을 지정하면 숨겨집니다. 이를 통해 문서 전체가 아닌 필요한 값만 효율적으로 조회할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 demo330이라는 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo330.insertOne({"Id":101,"Name":"Chris","Age":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e52149ff8647eb59e562081")
}
> db.demo330.insertOne({"Id":102,"Name":"Sam","Age":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5214aaf8647eb59e562082")
}
> db.demo330.insertOne({"Id":103,"Name":"David","Age":28});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5214b3f8647eb59e562083")
}
> db.demo330.insertOne({"Id":104,"Name":"Bob","Age":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e5214bdf8647eb59e562084")
}위 명령은 Id, Name, Age 세 개의 필드를 가진 문서 네 개를 컬렉션에 추가합니다.
2. find()로 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 확인할 수 있습니다.
> db.demo330.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e52149ff8647eb59e562081"), "Id" : 101, "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e5214aaf8647eb59e562082"), "Id" : 102, "Name" : "Sam", "Age" : 24 }
{ "_id" : ObjectId("5e5214b3f8647eb59e562083"), "Id" : 103, "Name" : "David", "Age" : 28 }
{ "_id" : ObjectId("5e5214bdf8647eb59e562084"), "Id" : 104, "Name" : "Bob", "Age" : 23 }기본적으로 모든 필드가 함께 반환되는 것을 확인할 수 있습니다.
3. 프로젝션으로 특정 필드만 표시하기
이제 반환되는 데이터를 제한해 보겠습니다. find()의 두 번째 인자로 프로젝션을 전달하면 되는데, 아래 쿼리에서는 Name 필드에 1을 설정했으므로 Name 값만 화면에 표시됩니다.
> db.demo330.find({},{Name:1});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e52149ff8647eb59e562081"), "Name" : "Chris" }
{ "_id" : ObjectId("5e5214aaf8647eb59e562082"), "Name" : "Sam" }
{ "_id" : ObjectId("5e5214b3f8647eb59e562083"), "Name" : "David" }
{ "_id" : ObjectId("5e5214bdf8647eb59e562084"), "Name" : "Bob" }참고 사항
프로젝션을 사용할 때 주의할 점이 있습니다. 기본적으로 _id 필드는 항상 반환됩니다. 만약 _id 필드까지 제외하고 싶다면 다음과 같이 _id에 0을 명시적으로 설정하면 됩니다.
> db.demo330.find({},{_id:0, Name:1});또한 포함 방식(1)과 제외 방식(0)은 하나의 프로젝션에서 혼용할 수 없으며, 예외적으로 _id 필드만 두 방식을 함께 사용할 수 있다는 점을 기억해 두면 좋습니다. 이처럼 프로젝션을 활용하면 불필요한 데이터 전송을 줄여 애플리케이션 성능을 향상시킬 수 있습니다.