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

MongoDB에서 쉼표가 포함된 문자열을 double 타입으로 변환하는 쿼리 작성법

쉼표(,)가 포함된 문자열을 double 숫자 타입으로 변환하려면 aggregate() 메서드를 활용해야 합니다. 이때 $split, $reduce, $convert 같은 집계 연산자를 조합하면 손쉽게 처리할 수 있습니다.

샘플 데이터 준비하기

먼저 문서가 담긴 컬렉션을 생성해 보겠습니다.

> db.demo335.insertOne({"Value":"45,67,78.0"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e522a1cf8647eb59e562091")
}
> db.demo335.insertOne({"Value":"17664,76,534.0"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e522a26f8647eb59e562092")
}
> db.demo335.insertOne({"Value":"8899,322,135,875.50"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e522a34f8647eb59e562093")
}
> db.demo335.insertOne({"Value":"1,533.07"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e522ab9f8647eb59e562094")
}

저장된 문서 확인하기

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다.

> db.demo335.find();

위 명령을 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e522a1cf8647eb59e562091"), "Value" : "45,67,78.0" }
{ "_id" : ObjectId("5e522a26f8647eb59e562092"), "Value" : "17664,76,534.0" }
{ "_id" : ObjectId("5e522a34f8647eb59e562093"), "Value" : "8899,322,135,875.50" }
{ "_id" : ObjectId("5e522ab9f8647eb59e562094"), "Value" : "1,533.07" }

쉼표가 포함된 문자열을 double로 변환하는 쿼리

다음은 쉼표가 들어간 문자열을 double 값으로 변환하는 집계 쿼리입니다.

db.demo335.aggregate([
...    { $project: {
...       data: {
...          $convert: {
...             input: {
...                $reduce: {
...                   input: {
...                      $split: ['$Value', ',']
...                   },
...                   initialValue: '',
...                   in: {
...                      $concat: ['$$value', '$$this']
...                   }
...                }
...             },
...             to: 'double',
...             onError: 0
...          }
...       }
...    }}
... ])

이 쿼리의 동작 원리를 단계별로 살펴보면 다음과 같습니다.

  • $split: 'Value' 필드의 문자열을 쉼표(,)를 기준으로 잘라 배열로 만듭니다.
  • $reduce: 분할된 배열의 각 요소를 초기값 ''부터 시작해 차례대로 이어 붙여($concat) 하나의 문자열로 합칩니다. 결과적으로 쉼표가 모두 제거됩니다.
  • $convert: 쉼표가 제거된 문자열을 'double' 타입으로 변환합니다.
  • onError: 0: 변환 과정에서 오류가 발생하면 예외 대신 0을 반환하도록 설정합니다.

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{ "_id" : ObjectId("5e522a1cf8647eb59e562091"), "data" : 456778 }
{ "_id" : ObjectId("5e522a26f8647eb59e562092"), "data" : 1766476534 }
{ "_id" : ObjectId("5e522a34f8647eb59e562093"), "data" : 8899322135875.5 }
{ "_id" : ObjectId("5e522ab9f8647eb59e562094"), "data" : 1533.07 }

이처럼 aggregate() 파이프라인 안에서 $split → $reduce → $convert 순서로 연산자를 조합하면, 쉼표가 포함된 문자열도 안전하게 숫자(double) 타입으로 변환할 수 있습니다.