MongoDB에서 단일 필드만 선택하는 방법
MongoDB에서 컬렉션에 저장된 문서 전체가 아니라 특정 필드 하나만 조회하고 싶을 때가 있습니다. 이럴 때는 find() 메서드의 두 번째 인자인 프로젝션(projection)을 활용하면 원하는 필드만 깔끔하게 추출할 수 있습니다.
기본 문법
db.yourCollectionName.find({"yourFieldName": yourValue}, {"yourSingleFieldName": 1, _id: 0});위 문법에서 각 요소가 의미하는 바는 다음과 같습니다.
- {"yourFieldName": yourValue} : 조회 조건(query)으로, 해당 조건과 일치하는 문서만 검색합니다.
- {"yourSingleFieldName": 1} : 결과에 포함할 필드를 지정합니다. 값이 1이면 포함, 0이면 제외를 뜻합니다.
- _id: 0 : MongoDB는 기본적으로 _id 필드를 항상 반환하므로, 이를 제외하려면 명시적으로 0으로 설정해야 합니다.
예제 데이터 준비
문법을 실제로 이해하기 위해 학생 정보가 담긴 컬렉션을 만들어 보겠습니다. 다음 쿼리로 singleFieldDemo 컬렉션에 문서를 삽입합니다.
> db.singleFieldDemo.insertOne({"StudentName":"David","StudentAge":28});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6eba356fd07954a489067c")
}
> db.singleFieldDemo.insertOne({"StudentName":"Bob","StudentAge":18});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6eba406fd07954a489067d")
}
> db.singleFieldDemo.insertOne({"StudentName":"Chris","StudentAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6eba4c6fd07954a489067e")
}
> db.singleFieldDemo.insertOne({"StudentName":"Robert","StudentAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c6eba586fd07954a489067f")
}저장된 문서 전체 조회하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 읽기 좋게 출력할 수 있습니다.
> db.singleFieldDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c6eba356fd07954a489067c"),
"StudentName" : "David",
"StudentAge" : 28
}
{
"_id" : ObjectId("5c6eba406fd07954a489067d"),
"StudentName" : "Bob",
"StudentAge" : 18
}
{
"_id" : ObjectId("5c6eba4c6fd07954a489067e"),
"StudentName" : "Chris",
"StudentAge" : 24
}
{
"_id" : ObjectId("5c6eba586fd07954a489067f"),
"StudentName" : "Robert",
"StudentAge" : 26
}단일 필드만 선택하는 쿼리 실행
이제 나이가 18세인 학생의 이름(StudentName)만 조회해 보겠습니다. 첫 번째 인자에는 검색 조건을, 두 번째 인자에는 프로젝션을 넣어줍니다.
> db.singleFieldDemo.find({"StudentAge":18},{"StudentName":1,"_id":0});실행 결과는 다음과 같습니다.
{ "StudentName" : "Bob" }마무리
이처럼 프로젝션을 사용하면 불필요한 데이터 없이 필요한 필드만 효율적으로 가져올 수 있습니다. 특히 대용량 컬렉션을 다룰 때는 전송되는 데이터 크기를 줄여 성능 최적화에도 도움이 되므로, 실무에서 꼭 알아두면 유용한 기법입니다.