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

MongoDB 부동 소수점 변환 시 항상 0이 반환되는 이유와 해결 방법

MongoDB에서 문자열을 부동 소수점으로 변환하는 방법

MongoDB에서 문자열로 저장된 숫자 값을 부동 소수점(float) 타입으로 변환할 때 parseFloat() 함수를 사용하면 됩니다. 변환이 제대로 이루어지지 않고 항상 0이 반환된다면, 대부분 스크립트 작성 방식에 문제가 있는 경우입니다. 아래 예제를 통해 올바른 변환 방법을 살펴보겠습니다.

1. 테스트용 컬렉션 생성

먼저 문서를 포함하는 컬렉션을 생성합니다. 이 예제에서는 값이 문자열 형태로 저장되어 있습니다.

> db.demo523.insertOne({"details":{values:"-0.45"}});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e89b7efb3fbf26334ef611f")
}

2. 컬렉션의 모든 문서 조회

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.

> db.demo523.find();

위 명령은 다음과 같은 결과를 출력합니다.

{ "_id" : ObjectId("5e89b7efb3fbf26334ef611f"), "details" : { "values" : "-0.45" } }

현재 values 필드의 값 -0.45가 따옴표로 묶인 문자열 상태임을 확인할 수 있습니다.

3. parseFloat()를 활용한 문자열 → 부동 소수점 변환

다음은 parseFloat()를 사용하여 문자열 값을 부동 소수점 숫자로 변환하고, 변경된 문서를 다시 저장하는 쿼리입니다. 이 쿼리는 0이 아닌 정상적인 값으로 변환됩니다.

> db.getCollection('demo523').find({}).forEach( function(d)
... { d.details.values = parseFloat( d.details.values )
... db.getCollection('demo523').save(d)} );

여기서 핵심은 forEach() 내부에서 각 문서의 필드 값을 parseFloat()로 변환한 뒤, 반드시 save()를 호출하여 변경 사항을 저장해야 한다는 점입니다.

4. 변환 결과 확인

변환 후 다시 find() 메서드로 문서를 조회해 보겠습니다.

> db.demo523.find();

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

{ "_id" : ObjectId("5e89b7efb3fbf26334ef611f"), "details" : { "values" : -0.45 } }

이제 values 필드의 값이 문자열이 아닌 숫자 타입의 -0.45로 정상적으로 변환된 것을 확인할 수 있습니다.

정리 및 주의 사항

  • 문자열로 저장된 숫자는 집계나 정렬 연산에서 의도한 대로 동작하지 않으므로, 가능한 한 숫자 타입으로 저장하는 것이 좋습니다.
  • parseFloat() 변환 후에는 반드시 save() 또는 updateOne() 등의 쓰기 연산을 호출해야 변경 사항이 데이터베이스에 반영됩니다.
  • 값이 null이거나 빈 문자열인 경우 parseFloat()는 NaN을 반환하므로, 대량의 데이터를 변환하기 전에 유효성 검사 로직을 추가하는 것이 안전합니다.