쉼표(,)가 포함된 문자열을 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) 타입으로 변환할 수 있습니다.