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

MongoDB에서 NaN 값을 가진 문서를 조회하는 방법 완벽 가이드

MongoDB에서 특정 필드의 값이 NaN(Not a Number)인 문서를 모두 찾아야 하는 경우가 있습니다. 데이터 검증이나 이상치 분석을 할 때 자주 필요한 작업인데요. 이 글에서는 NaN 값이 저장된 컬렉션을 만들고, 해당 문서를 조회하는 다양한 방법을 단계별로 살펴보겠습니다.

기본 조회 문법

MongoDB에서 NaN 값을 가진 필드를 찾는 기본적인 쿼리 문법은 다음과 같습니다.

db.yourCollectionName.find({ yourFieldName: NaN })

테스트용 컬렉션 생성하기

실습을 위해 먼저 NaN과 일반 숫자 값이 섞여 있는 문서들을 담은 컬렉션을 만들어 보겠습니다. JavaScript에서 0/0은 NaN으로 평가되고, 10/5는 2, 20/0은 Infinity, 0/20은 0이 됩니다.

> db.nanDemo.insertOne({"Score": 0/0});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca251a26304881c5ce84b8a")
}
> db.nanDemo.insertOne({"Score": 10/5});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca2520e6304881c5ce84b8b")
}
> db.nanDemo.insertOne({"Score": 20/0});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca252156304881c5ce84b8c")
}
> db.nanDemo.insertOne({"Score": 0/20});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5ca2521e6304881c5ce84b8d")
}

저장된 전체 문서 확인하기

find() 메서드를 사용해 컬렉션에 저장된 모든 문서를 출력해 보겠습니다.

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

실행 결과는 다음과 같습니다. 네 개의 문서 중 첫 번째 문서만 Score 필드가 NaN인 것을 확인할 수 있습니다.

{ "_id" : ObjectId("5ca251a26304881c5ce84b8a"), "Score" : NaN }
{ "_id" : ObjectId("5ca2520e6304881c5ce84b8b"), "Score" : 2 }
{ "_id" : ObjectId("5ca252156304881c5ce84b8c"), "Score" : Infinity }
{ "_id" : ObjectId("5ca2521e6304881c5ce84b8d"), "Score" : 0 }

방법 1: 0/0 표현식으로 조회하기

JavaScript에서 0/0은 NaN으로 평가되므로, 이 표현식을 조건에 직접 사용할 수 있습니다.

> db.nanDemo.find({ Score: 0/0 });

실행 결과, Score가 NaN인 문서 하나만 정확히 반환됩니다.

{ "_id" : ObjectId("5ca251a26304881c5ce84b8a"), "Score" : NaN }

방법 2: NaN 리터럴로 직접 조회하기

더 간결하고 직관적인 방법은 NaN 리터럴을 그대로 조건값으로 사용하는 것입니다. 결과는 동일합니다.

> db.nanDemo.find({ Score: NaN })
{ "_id" : ObjectId("5ca251a26304881c5ce84b8a"), "Score" : NaN }

참고 사항

NaN은 IEEE 754 부동소수점 표준에서 정의된 특수 값으로, 자기 자신과도 같지 않다는(NaN !== NaN) 독특한 성질을 가집니다. 하지만 MongoDB의 BSON 타입 비교 방식 덕분에 위와 같이 NaN을 조건으로 지정하면 정상적으로 매칭됩니다. 또한 Infinity 값은 NaN과 별개의 값이므로 함께 걸러지지 않으며, Infinity 문서를 찾으려면 별도로 { Score: Infinity } 조건을 사용해야 합니다.