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

MongoDB에서 문자열을 int로 변환하는 방법

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 기반의 집계 방식이 성능 면에서 유리합니다.