MongoDB에서 문자열 타입으로 저장된 숫자 데이터를 int 타입으로 변환해야 하는 경우가 종종 있습니다. 예를 들어, 가격이나 수량 같은 필드가 실수로 문자열로 저장되었다면 정렬, 집계, 수치 연산 등에서 문제가 발생할 수 있습니다. 이럴 때 parseInt() 함수를 활용하면 간단하게 해결할 수 있습니다.
샘플 컬렉션 생성하기
먼저 문자열 형태의 가격 데이터를 가진 문서들로 컬렉션을 생성해 보겠습니다.
> db.demo369.insertOne({"Price":"1000000"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e57e2e32ae06a1609a00aed")
}
> db.demo369.insertOne({"Price":"1747864"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e57e2e92ae06a1609a00aee")
}
> db.demo369.insertOne({"Price":"19548575"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e57e2ee2ae06a1609a00aef")
}저장된 문서 확인하기
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo369.find();
위 명령을 실행하면 다음과 같은 결과가 출력됩니다. Price 필드의 값이 따옴표로 묶여 있는 것을 확인할 수 있으며, 이는 해당 값이 문자열 타입으로 저장되어 있음을 의미합니다.
{ "_id" : ObjectId("5e57e2e32ae06a1609a00aed"), "Price" : "1000000" }
{ "_id" : ObjectId("5e57e2e92ae06a1609a00aee"), "Price" : "1747864" }
{ "_id" : ObjectId("5e57e2ee2ae06a1609a00aef"), "Price" : "19548575" }문자열을 int로 변환하는 쿼리
다음은 forEach()와 parseInt()를 조합하여 모든 문서의 문자열 값을 int로 변환하는 쿼리입니다. 각 문서를 순회하면서 Price 필드를 정수형으로 변경한 뒤 다시 저장하는 방식입니다.
> db.demo369.find().forEach( function (d) {
... d.Price= parseInt(d.Price);
... db.demo369.save(d);
... });변환 결과 확인하기
변환이 완료된 후 다시 한번 find() 메서드로 전체 문서를 조회해 보겠습니다.
> db.demo369.find();
실행 결과를 보면 Price 필드의 값에서 따옴표가 사라진 것을 확인할 수 있습니다. 이제 값들이 문자열이 아닌 정수(int) 타입으로 저장되었기 때문에 수치 연산이나 정렬 작업을 정상적으로 수행할 수 있습니다.
{ "_id" : ObjectId("5e57e2e32ae06a1609a00aed"), "Price" : 1000000 }
{ "_id" : ObjectId("5e57e2e92ae06a1609a00aee"), "Price" : 1747864 }
{ "_id" : ObjectId("5e57e2ee2ae06a1609a00aef"), "Price" : 19548575 }참고: 최신 MongoDB 버전에서는 $toInt 연산자 활용
MongoDB 4.0 이상 버전을 사용 중이라면 집계 파이프라인의 $toInt 연산자를 사용하는 방법도 고려할 수 있습니다. 이 방식은 서버 측에서 일괄 변환을 처리하므로 대량의 데이터를 다룰 때 더 효율적입니다.
> db.demo369.aggregate([
... { $addFields: { Price: { $toInt: "$Price" } } },
... { $merge: "demo369" }
... ]);데이터 양이 적다면 위에서 소개한 parseInt() 방식으로도 충분하지만, 프로덕션 환경에서 대규모 컬렉션을 변환할 때는 $toInt 기반의 집계 방식이 성능 면에서 유리합니다.