개요: MongoDB 조회 결과에서 _id가 항상 보이는 이유
MongoDB는 모든 문서(document)에 고유 식별자인 _id 필드를 자동으로 생성합니다. 따라서 find() 메서드로 문서를 조회하면 별도 설정이 없는 한 _id 필드가 항상 결과에 포함됩니다.
하지만 클라이언트에게 데이터를 전달하거나 API 응답을 구성할 때는 내부 식별자인 _id를 노출하고 싶지 않은 경우가 많습니다. 이럴 때는 프로젝션(projection)에 {'_id': false} 옵션을 지정하여 손쉽게 제외할 수 있습니다.
_id 필드를 제외하는 기본 문법
db.yourCollectionName.find({}, {'_id': false}).pretty();find() 메서드의 두 번째 인자가 바로 프로젝션입니다. 여기에 '_id': false를 지정하면 조회 결과에서 _id 필드가 제거됩니다.
예제용 컬렉션 생성하기
문법을 실제로 확인해 보기 위해 샘플 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.removingidElementDemo.insertOne({"UserName":"John", "UserAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9153fd4afe5c1d2279d6ad")
}
> db.removingidElementDemo.insertOne({"UserName":"Carol", "UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9154084afe5c1d2279d6ae")
}
> db.removingidElementDemo.insertOne({"UserName":"David", "UserAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9154154afe5c1d2279d6af")
}
> db.removingidElementDemo.insertOne({"UserName":"Mike", "UserAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9154204afe5c1d2279d6b0")
}
> db.removingidElementDemo.insertOne({"UserName":"Chris", "UserAge":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c91542c4afe5c1d2279d6b1")
}find()로 전체 문서 조회하기
먼저 아무 옵션 없이 find() 메서드로 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.removingidElementDemo.find().pretty();
실행 결과는 다음과 같습니다. 모든 문서에 _id 필드가 포함되어 있는 것을 확인할 수 있습니다.
{
"_id" : ObjectId("5c9153fd4afe5c1d2279d6ad"),
"UserName" : "John",
"UserAge" : 21
}
{
"_id" : ObjectId("5c9154084afe5c1d2279d6ae"),
"UserName" : "Carol",
"UserAge" : 24
}
{
"_id" : ObjectId("5c9154154afe5c1d2279d6af"),
"UserName" : "David",
"UserAge" : 22
}
{
"_id" : ObjectId("5c9154204afe5c1d2279d6b0"),
"UserName" : "Mike",
"UserAge" : 26
}
{
"_id" : ObjectId("5c91542c4afe5c1d2279d6b1"),
"UserName" : "Chris",
"UserAge" : 20
}_id를 제외하고 조회하기
이제 프로젝션에 {'_id': false}를 지정하여 _id 요소를 제거한 채 조회해 보겠습니다.
> db.removingidElementDemo.find({}, {'_id': false}).pretty();실행 결과는 다음과 같습니다. _id 필드가 사라지고 필요한 필드만 깔끔하게 출력됩니다.
{ "UserName" : "John", "UserAge" : 21 }
{ "UserName" : "Carol", "UserAge" : 24 }
{ "UserName" : "David", "UserAge" : 22 }
{ "UserName" : "Mike", "UserAge" : 26 }
{ "UserName" : "Chris", "UserAge" : 20 }파이썬 PyMongo에서 동일하게 적용하기
파이썬의 PyMongo 드라이버에서도 원리는 완전히 동일합니다. find() 메서드의 두 번째 인자로 {'_id': False} 딕셔너리를 넘겨주면 됩니다.
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['testDB']
collection = db['removingidElementDemo']
# _id 필드를 제외하고 모든 문서 조회
for doc in collection.find({}, {'_id': False}):
print(doc)실행하면 다음과 같이 _id 없이 UserName과 UserAge만 출력됩니다.
{'UserName': 'John', 'UserAge': 21}
{'UserName': 'Carol', 'UserAge': 24}
{'UserName': 'David', 'UserAge': 22}
{'UserName': 'Mike', 'UserAge': 26}
{'UserName': 'Chris', 'UserAge': 20}정리 및 주의사항
- 프로젝션에서
{'_id': false}(또는{'_id': 0})를 지정하면 조회 결과에서 _id 필드가 제외됩니다. - _id는 유일하게
false지정이 허용되는 필드입니다. 다른 필드들은 포함(true)과 제외(false)를 섞어 사용할 수 없습니다. - 단, _id를 제외한다고 해서 데이터베이스 내부에서 해당 값이 삭제되는 것은 아니며, 단순히 조회 결과 화면에서만 숨겨집니다.
- API 응답 등에서 ObjectId 직렬화가 번거롭다면 이 방법으로 간편하게 처리할 수 있습니다.