MongoDB $type 연산자란?
MongoDB의 $type 연산자는 필드의 값이 지정된 BSON 타입에 해당하는 문서만 선택하는 쿼리 연산자입니다. 데이터베이스에는 숫자와 문자열처럼 겉보기에 비슷하지만 실제 저장된 데이터 타입이 다른 값들이 섞여 있을 수 있습니다. 이럴 때 $type을 활용하면 원하는 데이터 타입을 가진 문서만 정확하게 필터링할 수 있습니다.
실제 예제를 통해 $type 연산자의 동작 방식을 살펴보겠습니다.
데모 컬렉션 생성 및 데이터 삽입
먼저 테스트용 컬렉션을 만들고, 숫자 타입과 문자열 타입의 값을 가진 문서들을 삽입합니다.
> db.demo615.insert({"Value":100});
WriteResult({ "nInserted" : 1 })
> db.demo615.insert({"Value":"100"});
WriteResult({ "nInserted" : 1 })
> db.demo615.insert({"Value":"300"});
WriteResult({ "nInserted" : 1 })
> db.demo615.insert({"Value":300});
WriteResult({ "nInserted" : 1 })위 코드에서는 숫자 100, 문자열 "100", 문자열 "300", 숫자 300을 차례로 삽입했습니다. 즉, 같은 값이라도 숫자형과 문자열형이 혼재되어 있는 상태입니다.
find() 메서드로 전체 문서 조회하기
삽입된 모든 문서를 find() 메서드로 확인해 보겠습니다.
> db.demo615.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e99bb3465492f6c60d0027f"), "Value" : 100 }
{ "_id" : ObjectId("5e99bb3865492f6c60d00280"), "Value" : "100" }
{ "_id" : ObjectId("5e99bb3c65492f6c60d00281"), "Value" : "300" }
{ "_id" : ObjectId("5e99bb4265492f6c60d00282"), "Value" : 300 }출력 결과를 보면 네 개의 문서 중 두 개는 숫자 타입, 나머지 두 개는 문자열 타입임을 알 수 있습니다. 다만 화면상으로는 값이 같아 보일 수 있어 일반적인 조회만으로는 구분이 어렵습니다.
$type으로 문자열 타입 문서만 조회하기
이제 $type 연산자를 사용하여 Value 필드가 문자열(string) 타입인 문서만 조회해 보겠습니다.
> db.demo615.find({ "Value" : { $type : "string"} } );실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e99bb3865492f6c60d00280"), "Value" : "100" }
{ "_id" : ObjectId("5e99bb3c654926c60d00281"), "Value" : "300" }결과를 보면 문자열 타입의 값("100", "300")을 가진 두 개의 문서만 반환된 것을 확인할 수 있습니다. 숫자 타입의 100과 300은 쿼리 결과에서 제외되었습니다.
정리
$type 연산자는 별칭(alias) 방식 외에도 BSON 타입 번호를 사용할 수도 있습니다. 예를 들어 문자열은 타입 번호 2이므로 { $type : 2 }와 같이 작성해도 동일한 결과를 얻습니다. 데이터 타입의 일관성 검증이나 마이그레이션 작업 시 특정 타입의 문서를 찾아야 할 때 $type 연산자가 매우 유용하게 활용됩니다.