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

MongoDB에서 문자열을 숫자 값으로 변환하는 방법

MongoDB는 스키마가 유연한 NoSQL 데이터베이스이기 때문에 처음에는 문자열로 저장된 값을 나중에 숫자로 바꿔야 하는 경우가 종종 발생합니다. 예를 들어 직원 ID나 코드 번호처럼 원래 텍스트 형태로 입력된 데이터를 정렬, 집계 또는 수학 연산에 활용하려면 숫자 타입으로 변환하는 것이 좋습니다.

MongoDB에서 문자열을 숫자 값으로 변환하려면 별도의 변환 코드를 작성해야 합니다. 이 글에서는 forEach()parseInt()를 이용해 문자열 필드를 정수형으로 일괄 변경하는 방법을 단계별로 살펴보겠습니다.

1. 테스트용 컬렉션 생성하기

먼저 문자열 타입의 EmployeeId 필드를 가진 문서들을 담은 컬렉션을 만들어 보겠습니다.

> db.convertStringToNumberDemo.insertOne({"EmployeeId":"101","EmployeeName":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7f56528d10a061296a3c31")
}
> db.convertStringToNumberDemo.insertOne({"EmployeeId":"1120","EmployeeName":"Mike"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7f56648d10a061296a3c32")
}
> db.convertStringToNumberDemo.insertOne({"EmployeeId":"3210","EmployeeName":"Sam"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c7f566e8d10a061296a3c33")
}

위 쿼리에서 EmployeeId는 따옴표로 묶인 문자열("101", "1120", "3210")로 저장되었습니다.

2. 저장된 문서 확인하기

find() 메서드와 pretty()를 사용해 컬렉션의 모든 문서를 출력해 봅니다.

> db.convertStringToNumberDemo.find().pretty();

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5c7f56528d10a061296a3c31"),
   "EmployeeId" : "101",
   "EmployeeName" : "Larry"
}
{
   "_id" : ObjectId("5c7f56648d10a061296a3c32"),
   "EmployeeId" : "1120",
   "EmployeeName" : "Mike"
}
{
   "_id" : ObjectId("5c7f566e8d10a061296a3c33"),
   "EmployeeId" : "3210",
   "EmployeeName" : "Sam"
}

현재 모든 EmployeeId 값이 큰따옴표로 감싸진 문자열 상태임을 확인할 수 있습니다.

3. forEach()와 parseInt()로 문자열을 숫자로 변환하기

이제 컬렉션의 각 문서를 순회하면서 parseInt() 함수로 EmployeeId 값을 정수로 변환하고, $set 연산자를 통해 업데이트합니다.

> db.convertStringToNumberDemo.find().forEach(function(x)
   ... {
      ... db.convertStringToNumberDemo.update
      ... (
         ...
         ... {
            ... "_id": x._id,
            ...
         ... },
         ... {
            ... "$set":
            ... {
               ... "EmployeeId": parseInt(x.EmployeeId)
            ... }
         ... }
      ... )
   ... }
... );

동작 방식을 간단히 설명하면 다음과 같습니다.

  • find().forEach(): 컬렉션의 모든 문서를 하나씩 가져와 콜백 함수를 실행합니다.
  • _id 조건: 각 문서의 고유한 _id 값을 기준으로 해당 문서만 정확하게 업데이트합니다.
  • parseInt(x.EmployeeId): 문자열로 저장된 ID를 정수(int) 타입으로 변환합니다.
  • $set 연산자: 기존 필드의 값만 새로운 숫자 값으로 교체하며, 문서의 다른 필드는 그대로 유지됩니다.

4. 변환 결과 검증하기

업데이트가 완료되었으므로 다시 한번 문서를 조회하여 결과를 확인합니다.

> db.convertStringToNumberDemo.find().pretty();

아래 출력 결과에서 EmployeeId가 문자열이 아닌 정수 값(따옴표 없음)으로 성공적으로 변환된 것을 확인할 수 있습니다.

{
   "_id" : ObjectId("5c7f56528d10a061296a3c31"),
   "EmployeeId" : 101,
   "EmployeeName" : "Larry"
}
{
   "_id" : ObjectId("5c7f56648d10a061296a3c32"),
   "EmployeeId" : 1120,
   "EmployeeName" : "Mike"
}
{
   "_id" : ObjectId("5c7f566e8d10a061296a3c33"),
   "EmployeeId" : 3210,
   "EmployeeName" : "Sam"
}

참고: 최신 버전에서 사용 가능한 대안

MongoDB 4.0 이상 버전을 사용한다면 애그리게이션 파이프라인의 $toInt 또는 $convert 연산자를 활용해 서버 측에서 타입을 변환할 수도 있습니다.

> db.convertStringToNumberDemo.updateMany(
...   { "EmployeeId": { $type: "string" } },
...   [{ $set: { "EmployeeId": { $toInt: "$EmployeeId" } } }]
... );

이 방법은 클라이언트에서 자바스크립트를 반복 실행하는 것보다 효율적이며, 소수점이 포함된 값이라면 parseFloat() 또는 $toDouble을 사용하면 됩니다. 다만 변환 전에 반드시 데이터 백업을 해두는 것이 안전합니다.