MongoDB 집계 프레임워크에서 _id 필드만 제외하는 방법
MongoDB에서 쿼리 결과를 조회하면 _id 필드는 기본적으로 항상 함께 반환됩니다. 하지만 집계 프레임워크의 $project 연산자를 활용하면 원하는 필드만 선택하거나, 반대로 _id만 제외하고 나머지 필드는 그대로 유지할 수 있습니다. 이 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성하기
먼저 학생 정보가 담긴 문서들로 컬렉션을 생성합니다.
> db.excludeIdDemo.insertOne({"StudentFirstName":"John","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd701a56d78f205348bc632")
}
> db.excludeIdDemo.insertOne({"StudentFirstName":"Robert","StudentAge":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd701af6d78f205348bc633")
}
> db.excludeIdDemo.insertOne({"StudentFirstName":"Chris","StudentAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd701b86d78f205348bc634")
}2단계: find()로 전체 문서 확인하기
find() 메서드를 사용하면 컬렉션의 모든 문서를 조회할 수 있습니다.
> db.excludeIdDemo.find();
실행 결과는 다음과 같습니다. 각 문서마다 _id 필드가 자동으로 포함되어 있는 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5cd701a56d78f205348bc632"), "StudentFirstName" : "John", "StudentAge" : 21 }
{ "_id" : ObjectId("5cd701af6d78f205348bc633"), "StudentFirstName" : "Robert", "StudentAge" : 20 }
{ "_id" : ObjectId("5cd701b86d78f205348bc634"), "StudentFirstName" : "Chris", "StudentAge" : 24 }3단계: $project로 _id 제외하기
집계 프레임워크의 $project 단계에서 _id : 0을 지정하면 해당 필드를 결과에서 제외할 수 있습니다. 아래 예제는 _id를 제외하면서 StudentFirstName 필드만 포함시키는 쿼리입니다.
> db.excludeIdDemo.aggregate(
{
$project :
{
_id : 0,
"StudentFirstName": 1
}
}
);
쿼리를 실행하면 다음과 같이 _id 없이 깔끔한 결과를 얻을 수 있습니다.
{ "StudentFirstName" : "John" }
{ "StudentFirstName" : "Robert" }
{ "StudentFirstName" : "Chris" }추가 팁: 모든 필드를 유지한 채 _id만 제거하기
$project에서 포함(1) 지정 없이 _id : 0만 단독으로 작성하면, 나머지 모든 필드는 그대로 유지되고 _id만 제외됩니다.
> db.excludeIdDemo.aggregate(
{ $project : { _id : 0 } }
);
또한 MongoDB 4.4 이상 버전에서는 전용 $unset 스테이지를 사용해 더욱 직관적으로 필드를 제거할 수도 있습니다.
> db.excludeIdDemo.aggregate(
{ $unset : ["_id"] }
);
정리
- $project에서 _id : 0을 지정하면 결과에서 _id가 제외됩니다.
- 포함 모드(필드명: 1)를 사용할 때도 _id는 기본적으로 포함되므로, 반드시 명시적으로 0으로 설정해야 합니다.
- _id : 0만 단독으로 지정하면 다른 모든 필드는 유지됩니다.
- MongoDB 4.4 이상에서는 $unset 스테이지로도 동일한 작업이 가능합니다.