MongoDB에서 map() 함수로 특정 값 목록 추출하기
MongoDB 쿼리 결과에서 특정 필드의 값들만 모아 목록 형태로 반환하고 싶다면 map() 함수를 활용하면 됩니다. map()은 커서(cursor)에 적용하여 각 문서를 원하는 형태로 변환한 결과를 배열로 돌려주는 메서드입니다.
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다.
> db.demo195.insertOne({"Subject":"MySQL"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3af3f203d395bdc21346d4")
}
> db.demo195.insertOne({"Subject":"MongoDB"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3af3f703d395bdc21346d5")
}
> db.demo195.insertOne({"Subject":"Java"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3af3fa03d395bdc21346d6")
}find() 메서드로 전체 문서 확인하기
삽입된 문서들이 제대로 저장되었는지 find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo195.find();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5e3af3f203d395bdc21346d4"), "Subject" : "MySQL" }
{ "_id" : ObjectId("5e3af3f703d395bdc21346d5"), "Subject" : "MongoDB" }
{ "_id" : ObjectId("5e3af3fa03d395bdc21346d6"), "Subject" : "Java" }map()을 사용해 특정 값 목록 반환하기
이제 쿼리 결과에서 각 문서의 Subject 필드 값만 추출하여 하나의 목록으로 반환하는 방법을 살펴보겠습니다. find()로 얻은 커서에 map()을 적용하고, 콜백 함수에서 원하는 필드 값을 반환하면 됩니다.
> db.demo195.find().map(function(doc){ return doc.Subject });실행하면 다음과 같이 Subject 값들만 담긴 배열이 출력됩니다.
[ "MySQL", "MongoDB", "Java" ]
정리
이처럼 MongoDB에서는 find().map() 조합을 사용하면 쿼리 결과에서 특정 필드의 값만 손쉽게 추출하여 배열 형태의 목록으로 받을 수 있습니다. 다만 map()은 클라이언트 측에서 동작하므로, 대량의 데이터를 다룰 때는 성능을 고려해야 합니다. 서버 측 처리가 필요한 경우 aggregation 파이프라인의 $group이나 $project 단계를 대안으로 활용할 수 있습니다.