MongoDB에서 문자열 필드에 저장된 값들 중 첫 번째 단어만 추출하여 중복 없이(unique) 조회하고 싶다면, distinct() 메서드와 JavaScript의 map(), split() 함수를 조합하면 간단하게 해결할 수 있습니다.
1. 샘플 컬렉션 생성하기
먼저 실습을 위해 문서가 포함된 컬렉션을 생성해 보겠습니다. 아래 예제에서는 학생 정보와 함께 특징을 설명하는 문장이 담긴 컬렉션을 만듭니다.
> db.distinctFirstWordDemo.insertOne(
{
"_id": 100,
"StudentName": "John",
"StudentFeature": "John is a good player",
"Subject": "MongoDB"
}
);
{ "acknowledged" : true, "insertedId" : 100 }
> db.distinctFirstWordDemo.insertOne(
{
"_id": 101,
"StudentName": "Carol",
"StudentFeature": "Carol is not a good player",
"Subject": "MongoDB"
}
);
{ "acknowledged" : true, "insertedId" : 101 }2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.distinctFirstWordDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : 100,
"StudentName" : "John",
"StudentFeature" : "John is a good player",
"Subject" : "MongoDB"
}
{
"_id" : 101,
"StudentName" : "Carol",
"StudentFeature" : "Carol is not a good player",
"Subject" : "MongoDB"
}3. 문자열에서 첫 번째 단어만 고유하게 추출하기
이제 핵심 쿼리입니다. distinct("StudentFeature")로 해당 필드의 고유한 값들을 먼저 가져온 뒤, map() 함수 내에서 split(" ")[0]을 적용하면 각 문장의 첫 번째 단어만 남게 됩니다.
> student = db.distinctFirstWordDemo.distinct("StudentFeature", {"Subject" : "MongoDB"}).map(function(st){
return st.split(" ")[0];
});
[ "John", "Carol" ]
> printjson(student);실행 결과는 다음과 같습니다.
[ "John", "Carol" ]
동작 원리 정리
위 쿼리의 처리 과정을 단계별로 살펴보면 다음과 같습니다.
1단계: distinct() 메서드가 Subject가 "MongoDB"인 문서들에서 StudentFeature 필드의 고유한 값들을 배열로 반환합니다.
2단계: map() 함수가 반환된 각 문자열에 대해 split(" ")을 호출하여 공백 기준으로 단어를 분리합니다.
3단계: 인덱스 [0]을 통해 분리된 단어 중 첫 번째 요소, 즉 문장의 첫 단어만 선택합니다.
이 방식은 별도의 애그리게이션 파이프라인 없이도 간단히 원하는 결과를 얻을 수 있으며, 문장 시작 부분의 키워드(예: 이름, 카테고리 등)를 빠르게 추출할 때 유용하게 활용됩니다.