MongoDB에서 문자열로 저장된 숫자 데이터를 실제 숫자 타입으로 변환해야 하는 경우가 종종 있습니다. 예를 들어, 데이터 마이그레이션 과정이나 외부 시스템에서 가져온 데이터가 문자열 형태로 저장되어 있을 때 이를 parseInt() 함수를 활용해 손쉽게 변환할 수 있습니다.
테스트용 컬렉션 생성
먼저 변환 작업을 테스트하기 위해 샘플 문서들이 담긴 컬렉션을 생성하겠습니다. 아래 예시에서는 value 필드에 숫자가 아닌 문자열 형태로 값이 저장되어 있습니다.
> db.demo208.insertOne( { "value":"50"} );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3d92d803d395bdc21346f6")
}
> db.demo208.insertOne( { "value":"2350"} );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e3d92dd03d395bdc21346f7")
}위 코드에서는 insertOne() 메서드를 사용하여 두 개의 문서를 삽입했습니다. 각각의 value 필드에는 따옴표로 감싸진 문자열 형태의 숫자("50", "2350")가 들어가 있는 점에 주목하세요.
변환 전 데이터 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo208.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e3d92d803d395bdc21346f6"), "value" : "50" }
{ "_id" : ObjectId("5e3d92dd03d395bdc21346f7"), "value" : "2350" }현재 value 필드의 값이 큰따옴표로 표시되어 있는 것을 확인할 수 있습니다. 즉, 아직 문자열 타입으로 저장되어 있는 상태입니다.
문자열을 숫자로 변환하는 쿼리 실행
이제 forEach()> 메서드와 함께 parseInt() 함수를 사용하여 모든 문서의 문자열 값을 숫자로 변환하는 쿼리를 실행합니다.
> db.demo208.find().forEach( function (doc) {
... doc.value = parseInt(doc.value);
... db.demo208.save(doc);
...});이 쿼리의 동작 원리는 다음과 같습니다.
- find().forEach(): 컬렉션의 모든 문서를 하나씩 순회하며 각 문서에 대해 지정된 함수를 실행합니다.
- parseInt(doc.value): 각 문서의
value필드 값을 정수형 숫자로 변환합니다. - db.demo208.save(doc): 변경된 문서를 동일한 컬렉션에 다시 저장하여 업데이트를 반영합니다.
변환 후 결과 확인
변환이 완료되었으므로 다시 한번 find() 메서드로 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.demo208.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e3d92d803d395bdc21346f6"), "value" : 50 }
{ "_id" : ObjectId("5e3d92dd03d395bdc21346f7"), "value" : 2350 }이제 value 필드의 값에서 따옴표가 사라진 것을 확인할 수 있습니다. 문자열이 성공적으로 숫자 타입으로 변환된 것입니다.
참고 사항
실무 환경에서는 몇 가지 추가로 고려할 점이 있습니다.
- 대량 데이터 처리: 문서 수가 많은 경우
bulkWrite()를 사용하면 개별 저장보다 훨씬 효율적으로 업데이트할 수 있습니다. - 소수점 처리: 소수가 포함된 문자열은
parseFloat()또는 MongoDB의$toDouble집계 연산자를 사용하는 것이 좋습니다. - 변환 실패 대비: 숫자로 변환할 수 없는 문자열이 섞여 있다면
isNaN()검사를 추가하여 오류를 방지하는 것이 안전합니다.
이처럼 parseInt()와 forEach()를 조합하면 MongoDB에서 문자열로 저장된 숫자 데이터를 간단하고 빠르게 숫자 타입으로 일괄 변환할 수 있습니다.