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

MongoDB에서 필드 타입을 변경하는 방법 (문자열 → 숫자 변환 예제)

MongoDB 필드 타입 변경 개요

이 글에서는 문자열(string) 타입의 필드를 정수(int) 타입으로 변환하는 과정을 예제와 함께 살펴보겠습니다. MongoDB의 애그리게이션(aggregation)은 필드의 타입을 직접 변경하는 기능을 제공하지 않기 때문에, 필드 타입을 변환하려면 별도의 코드를 작성해야 합니다.

1단계: 샘플 컬렉션 생성

먼저 문서 하나가 포함된 컬렉션을 생성합니다. 이후 각 필드의 현재 타입을 확인하게 됩니다. 컬렉션을 생성하는 쿼리는 다음과 같습니다.

>db.changeDataType.insertOne({"StudentName":"Larry","StudentAge":23,"StudentZipCode":"10001","isProgrammer":false});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c6ed4976fd07954a4890694")
}

2단계: 저장된 문서 조회

find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 조회할 수 있습니다. 쿼리는 다음과 같습니다.

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

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

{
   "_id" : ObjectId("5c6ed4976fd07954a4890694"),
   "StudentName" : "Larry",
   "StudentAge" : 23,
   "StudentZipCode" : "10001",
   "isProgrammer" : false
}

3단계: 각 필드의 타입 확인

이제 컬렉션에 있는 모든 필드의 타입을 확인해 보겠습니다. findOne()으로 문서를 가져온 뒤 JavaScript의 typeof 연산자를 활용하면 간단하게 확인할 수 있습니다.

> checkType=db.changeDataType.findOne();
{
   "_id" : ObjectId("5c6ed4976fd07954a4890694"),
   "StudentName" : "Larry",
   "StudentAge" : 23,
   "StudentZipCode" : "10001",
   "isProgrammer" : false
}

위에서 선언한 변수 “checkType”을 사용해 각 필드의 타입을 확인합니다. 쿼리는 다음과 같습니다.

> typeof checkType._id;
object
> typeof checkType.StudentName;
string
> typeof checkType.StudentAge;
number
> typeof checkType.StudentZipCode;
string
> typeof checkType.isProgrammer;
boolean

출력 결과를 보면 _id는 object, StudentName은 string, StudentAge는 number, StudentZipCode는 string, isProgrammer는 boolean 타입임을 알 수 있습니다.

4단계: 필드 타입 변경하기 (문자열 → 숫자)

이제 “StudentZipCode” 필드의 타입을 문자열에서 숫자(number) 타입으로 변경해 보겠습니다. forEach()로 모든 문서를 순회하면서 update()와 $set 연산자, 그리고 parseInt()를 조합하면 됩니다. 쿼리는 다음과 같습니다.

> db.changeDataType.find().forEach(function(ch)
... {
... db.changeDataType.update({
... "_id":ch._id},
... {"$set":
... {
... "StudentZipCode":parseInt(ch.StudentZipCode)
... }
... });
... });

5단계: 변경 결과 검증

“StudentZipCode” 필드의 타입을 문자열에서 숫자로 변경했습니다. 제대로 적용되었는지 확인하기 위해 앞서 살펴본 방법대로 필드 타입을 다시 조회해 보겠습니다.

> againCheckType=db.changeDataType.findOne();
{
   "_id" : ObjectId("5c6ed4976fd07954a4890694"),
   "StudentName" : "Larry",
   "StudentAge" : 23,
   "StudentZipCode" : 10001,
   "isProgrammer" : false
}

새로 선언한 변수를 사용해 해당 필드의 타입을 확인합니다.

> typeof againCheckType.StudentZipCode;
number

위 출력 결과에서 확인할 수 있듯이, “StudentZipCode” 필드는 더 이상 문자열(String)이 아니라 숫자(number) 타입으로 성공적으로 변경되었습니다.

참고: 최신 MongoDB 버전에서의 대안

MongoDB 4.2 이상에서는 업데이트 파이프라인(aggregation pipeline update)과 함께 $convert 또는 $toInt 연산자를 사용해 한 번의 명령으로 타입을 변환할 수도 있습니다.

db.changeDataType.updateMany(
  {},
  [ { "$set": { "StudentZipCode": { "$toInt": "$StudentZipCode" } } } ]
);

이 방식은 서버 측에서 일괄 처리되므로 대량의 문서를 변환할 때 훨씬 더 효율적입니다. 상황에 맞게 두 가지 방법 중 적절한 것을 선택해 사용하시기 바랍니다.