MongoDB에서 _id를 제외한 필드 값만 조회하기
MongoDB의 find() 메서드는 기본적으로 _id 필드를 포함한 모든 필드를 반환합니다. 하지만 데이터를 가공하거나 클라이언트에 전달할 때는 _id를 제외한 순수한 필드 값만 필요한 경우가 많습니다. 이번 글에서는 forEach() 반복문을 활용해 _id 없이 원하는 필드만 새로운 객체 배열로 만들어 출력하는 방법을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 생성
먼저 문서를 포함하는 컬렉션을 생성합니다.
> db.demo590.insert([
... { "Name": "Chris", "Age": 21 },
... {"Name": "Bob", "Age": 20},
... { "Name": "Sam", "Age": 19 }
... ]);
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
BulkWriteResult의 nInserted 값이 3으로 표시되면 세 개의 문서가 성공적으로 삽입된 것입니다.
2단계: find()로 전체 문서 확인
find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo590.find();
실행 결과는 다음과 같습니다. 각 문서에 ObjectId 형태의 _id 필드가 자동으로 포함되어 있는 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd0"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd1"), "Name" : "Bob", "Age" : 20 }
{ "_id" : ObjectId("5e92d514fd2d90c177b5bcd2"), "Name" : "Sam", "Age" : 19 }3단계: _id를 제외한 필드 값만 추출하는 쿼리
다음은 빈 배열과 forEach()를 조합하여 _id를 제외한 필드 값만 새로운 키 이름으로 담아내는 쿼리입니다.
> var listOfObject = [];
> db.demo590.find().forEach(function(d){
... var ob = {};
... ob["StudentFirstName"] = d.Name;
... ob["StudentAge"] = d.Age;
... listOfObject.push(ob);
... });
이 쿼리는 각 문서를 순회하면서 Name과 Age 값을 읽어 StudentFirstName, StudentAge라는 새로운 키에 매핑한 뒤, 완성된 객체를 listOfObject 배열에 하나씩 추가합니다. 이 과정에서 _id는 의도적으로 제외됩니다.
4단계: 결과 확인
생성된 배열을 출력해 보겠습니다.
> listOfObject;
실행 결과 _id 없이 필요한 필드만 담긴 객체 배열이 반환됩니다.
[
{
"StudentFirstName" : "Chris",
"StudentAge" : 21
},
{
"StudentFirstName" : "Bob",
"StudentAge" : 20
},
{
"StudentFirstName" : "Sam",
"StudentAge" : 19
}
]
참고: 프로젝션(Projection)으로 더 간단하게 처리하기
필드 이름을 변경할 필요가 없고 단순히 _id만 제외하고 싶다면 find()의 두 번째 인자인 프로젝션 옵션을 사용하는 것이 훨씬 간단합니다.
> db.demo590.find({}, { _id: 0 })여기서 _id: 0은 해당 필드를 결과에서 제외하겠다는 의미이며, 나머지 필드는 기본값인 1(포함)로 처리됩니다. 별도의 반복문 없이 한 번의 쿼리로 동일한 목적을 달성할 수 있으므로 성능 면에서도 유리합니다.
정리
지금까지 forEach()를 활용해 _id를 제외한 필드 값만 새로운 구조로 재구성하는 방법과, 프로젝션 옵션({ _id: 0 })으로 간단히 _id를 제외하는 방법을 살펴보았습니다. 필드명을 바꿔야 한다면 첫 번째 방법을, 단순히 _id만 숨기고 싶다면 프로젝션 방식을 선택하시면 됩니다.