Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 문자열 분할하기 – mapReduce() 집계 활용법

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 연산자를 사용하는 방법도 있으니, 상황에 맞게 선택하시기 바랍니다.