MongoDB에서 문자열을 분할하는 방법
MongoDB에서 저장된 문자열 데이터를 특정 구분자(예: 공백)를 기준으로 분리해야 하는 경우가 종종 있습니다. 예를 들어 "John Smith"처럼 이름과 성이 하나의 필드에 함께 저장되어 있을 때, 성(last name)만 별도로 추출하고 싶다면 mapReduce() 함수를 활용하면 됩니다.
이 글에서는 실제 예제를 통해 컬렉션 생성부터 문자열 분할, 결과 확인까지 전 과정을 단계별로 살펴보겠습니다.
1단계: 샘플 컬렉션 및 문서 생성
먼저 insertOne() 메서드를 사용해 테스트용 컬렉션에 문서를 하나 삽입합니다.
> db.splitString.insertOne({"StudentName":"John Smith"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0849d925ddae1f53b62206")
}2단계: 저장된 문서 확인
find() 메서드로 컬렉션의 모든 문서를 조회해 정상적으로 저장되었는지 확인합니다.
> db.splitString.find().pretty();
위 쿼리를 실행하면 다음과 같은 출력 결과를 얻을 수 있습니다.
{
"_id" : ObjectId("5e0849d925ddae1f53b62206"),
"StudentName" : "John Smith"
}3단계: mapReduce()로 문자열 분할하기
이제 핵심 단계입니다. mapReduce()의 map 함수 안에서 JavaScript의 split() 메서드를 사용해 문자열을 분할합니다.
> db.splitString.mapReduce(
... function() {
... var StudentLastName = this.StudentName.split(/\s/).reverse()[0].toUpperCase();
...
... emit({ "StudentLastName": StudentLastName, "FirstObjectId": this._id },this);
... },
... function(){},
... { "out": { "inline": 1 } }
... );코드 설명:
split(/\s/): 정규식/\s/를 기준으로 문자열을 공백 단위로 분리합니다. "John Smith"는 ["John", "Smith"] 배열이 됩니다..reverse()[0]: 배열을 뒤집어 마지막 요소, 즉 성(last name)을 가져옵니다..toUpperCase(): 추출한 성을 대문자로 변환합니다.emit(): 분할된 값과 원본 문서의 ObjectId를 함께 출력합니다.{ "out": { "inline": 1 } }: 결과를 새 컬렉션에 저장하지 않고 화면에 바로 반환합니다.
실행 결과
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"results" : [
{
"_id" : {
"StudentLastName" : "SMITH",
"FirstObjectId" : ObjectId("5e0849d925ddae1f53b62206")
},
"value" : {
"_id" : ObjectId("5e0849d925ddae1f53b62206"),
"StudentName" : "John Smith"
}
}
],
"timeMillis" : 32,
"counts" : {
"input" : 1,
"emit" : 1,
"reduce" : 0,
"output" : 1
},
"ok" : 1
}결과를 보면 StudentName 필드의 "John Smith"에서 성인 "SMITH"가 성공적으로 추출된 것을 확인할 수 있습니다. 또한 counts 항목을 통해 처리된 입력 문서 수(input), emit 호출 횟수, reduce 및 output 수를 파악할 수 있습니다.
마무리
이처럼 MongoDB에서는 mapReduce()와 JavaScript 문자열 메서드를 조합하면 집계 과정에서 손쉽게 문자열을 분할하고 원하는 부분만 추출할 수 있습니다. 참고로 최신 MongoDB 버전에서는 성능과 편의성이 개선된 집계 파이프라인(Aggregation Pipeline)의 $split 연산자를 사용하는 방법도 있으니, 상황에 맞게 선택하시기 바랍니다.