MongoDB에서 find() 메서드로 문서를 조회하면 기본적으로 _id 필드(ObjectId)가 항상 함께 반환됩니다. 이 객체 ID를 결과에서 제외하고 싶다면, 프로젝션(projection) 단계에서 _id 값을 0으로 설정하면 됩니다.
1. 테스트용 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.preventObjectIdDemo.insertOne(
... {
... "StudentName" : "Chris",
... "StudentDetails" : [
... {
... "StudentTotalScore" : 540,
... "StudentCountryName" : "US"
... },
... {
... "StudentTotalScore" : 489,
... "StudentCountryName" : "UK"
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5ca20a9c66324ffac2a7dc63")
}
2. find() 메서드로 전체 문서 조회하기
다음은 find() 메서드를 사용해 컬렉션의 모든 문서를 출력하는 기본 쿼리입니다.
> db.preventObjectIdDemo.find().pretty();
위 쿼리를 실행하면 다음과 같이 _id 필드가 자동으로 포함되어 출력됩니다.
{
"_id" : ObjectId("5ca20a9c66324ffac2a7dc63"),
"StudentName" : "Chris",
"StudentDetails" : [
{
"StudentTotalScore" : 540,
"StudentCountryName" : "US"
},
{
"StudentTotalScore" : 489,
"StudentCountryName" : "UK"
}
]
}3. _id 필드를 제외하고 조회하기
문서를 조회할 때 객체 ID가 결과에 나타나지 않도록 하려면, find() 메서드의 두 번째 인자인 프로젝션에 '_id': 0을 지정합니다. 아래 예제에서는 $slice 연산자를 함께 사용하여 배열 필드 중 첫 번째 요소만 가져오도록 했습니다.
> db.preventObjectIdDemo.find({ _id: ObjectId("5ca20a9c66324ffac2a7dc63")},
{StudentDetails: { $slice: [0, 1] } ,'_id': 0} ).pretty();실행 결과를 보면 _id(ObjectId)가 더 이상 표시되지 않는 것을 확인할 수 있습니다.
{
"StudentName" : "Chris",
"StudentDetails" : [
{
"StudentTotalScore" : 540,
"StudentCountryName" : "US"
}
]
}정리
- MongoDB의
find()메서드는 별도 설정이 없으면_id필드를 항상 반환합니다. - 프로젝션에서
_id: 0을 지정하면 조회 결과에서 객체 ID를 손쉽게 제외할 수 있습니다. $slice연산자를 활용하면 배열 타입 필드의 원하는 범위만 선택적으로 가져올 수 있어 응답 크기를 줄이는 데 유용합니다.