MongoDB에서 특정 필드가 null이 아니고 빈 문자열("")도 아닌 문서만 조회하고 싶다면 $nin 연산자를 사용하는 것이 가장 간단한 방법입니다. $nin은 'not in'의 약자로, 지정한 배열에 포함된 값과 일치하지 않는 문서를 반환합니다.
$nin 연산자 기본 문법
필드 값이 null 또는 빈 문자열이 아닌 문서를 찾으려면 다음과 같이 쿼리를 작성합니다.
db.yourCollectionName.find({yourFieldName:{$nin:[null,""]}});예제 컬렉션 생성하기
실습을 위해 여러 상태의 UserName 필드(정상 값, 빈 문자열, null)를 가진 컬렉션을 만들어 보겠습니다.
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":"Larry","UserAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20b6a629b87623db1b26")
}
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":"","UserAge":29});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20bea629b87623db1b27")
}
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":"Sam","UserAge":32});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20c7a629b87623db1b28")
}
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":null,"UserAge":27});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20d2a629b87623db1b29")
}
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":"Robert","UserAge":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20dda629b87623db1b2a")
}
> db.notEqualToNullOrEmptyDemo.insertOne({"UserName":"","UserAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9d20e7a629b87623db1b2b")
}전체 문서 확인하기
find() 메서드를 사용해 컬렉션의 모든 문서를 출력해 보겠습니다.
> db.notEqualToNullOrEmptyDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5c9d20b6a629b87623db1b26"),
"UserName" : "Larry",
"UserAge" : 24
}
{
"_id" : ObjectId("5c9d20bea629b87623db1b27"),
"UserName" : "",
"UserAge" : 29
}
{
"_id" : ObjectId("5c9d20c7a629b87623db1b28"),
"UserName" : "Sam",
"UserAge" : 32
}
{
"_id" : ObjectId("5c9d20d2a629b87623db1b29"),
"UserName" : null,
"UserAge" : 27
}
{
"_id" : ObjectId("5c9d20dda629b87623db1b2a"),
"UserName" : "Robert",
"UserAge" : 26
}
{
"_id" : ObjectId("5c9d20e7a629b87623db1b2b"),
"UserName" : "",
"UserAge" : 23
}총 6개의 문서 중 UserName이 빈 문자열인 문서 2개와 null인 문서 1개가 포함되어 있는 것을 확인할 수 있습니다.
null 또는 빈 값 제외 쿼리 실행하기
이제 $nin 연산자를 적용해 UserName이 null도 아니고 빈 문자열도 아닌 문서만 조회해 보겠습니다.
> db.notEqualToNullOrEmptyDemo.find({UserName:{$nin:[null,""]}}).pretty();실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9d20b6a629b87623db1b26"),
"UserName" : "Larry",
"UserAge" : 24
}
{
"_id" : ObjectId("5c9d20c7a629b87623db1b28"),
"UserName" : "Sam",
"UserAge" : 32
}
{
"_id" : ObjectId("5c9d20dda629b87623db1b2a"),
"UserName" : "Robert",
"UserAge" : 26
}결과 분석
실행 결과를 보면 UserName이 실제 유효한 값(Larry, Sam, Robert)을 가진 3개의 문서만 반환되었으며, 빈 문자열 또는 null을 가진 문서는 모두 제외되었습니다.
참고 사항
- MongoDB에서 {field: {$ne: null}} 조건은 해당 필드가 존재하지 않는 문서까지 함께 제외하므로 주의가 필요합니다.
- $nin 배열에 null을 포함하면 필드 자체가 없는 문서도 결과에서 제외됩니다.
- 공백만 있는 문자열(" ")까지 제외하려면 정규식($regex)을 추가로 활용하는 방법도 고려할 수 있습니다.
이처럼 $nin 연산자 하나만으로 null과 빈 문자열을 동시에 손쉽게 필터링할 수 있어, 데이터 검증이나 클린업 작업 시 매우 유용하게 활용됩니다.