MongoDB에서 $exists 연산자는 특정 필드가 문서에 존재하는지 여부를 확인할 때 사용하며, $ne 연산자는 '같지 않음(not equal)' 조건을 검사할 때 사용합니다. 이 두 연산자를 함께 활용하면 필드가 존재하면서 동시에 빈 문자열이 아닌 문서만 정확하게 조회할 수 있습니다.
샘플 컬렉션 생성
먼저 테스트에 사용할 문서들을 담은 컬렉션을 생성해 보겠습니다.
> db.existsDemo.insertOne({"Name":"Chris","Age":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7c3916d78f205348bc650")
}
> db.existsDemo.insertOne({"Name":"","Age":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7c39a6d78f205348bc651")
}
> db.existsDemo.insertOne({"Name":null,"Age":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7c3a66d78f205348bc652")
}
> db.existsDemo.insertOne({"Age":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd7c3c36d78f205348bc653")
}위 예제에는 네 가지 경우가 의도적으로 포함되어 있습니다. 값이 정상적인 문서, Name이 빈 문자열인 문서, Name이 null인 문서, 그리고 Name 필드 자체가 없는 문서입니다.
저장된 전체 문서 조회
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.existsDemo.find().pretty();
실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5cd7c3916d78f205348bc650"),
"Name" : "Chris",
"Age" : 21
}
{ "_id" : ObjectId("5cd7c39a6d78f205348bc651"), "Name" : "", "Age" : null }
{ "_id" : ObjectId("5cd7c3a66d78f205348bc652"), "Name" : null, "Age" : 24 }
{ "_id" : ObjectId("5cd7c3c36d78f205348bc653"), "Age" : 23 }$exists와 $ne 연산자 조합하기
이제 $exists 연산자와 $ne 연산자를 $and 조건으로 결합하여, Name 필드가 실제로 존재하면서 빈 문자열이 아닌 문서만 조회해 보겠습니다.
> db.existsDemo.find({"$and":[ {"Name":{"$exists":true}}, {"Name":{"$ne": ""}}]});실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5cd7c3916d78f205348bc650"), "Name" : "Chris", "Age" : 21 }
{ "_id" : ObjectId("5cd7c3a66d78f205348bc652"), "Name" : null, "Age" : 24 }결과 분석
결과를 보면 흥미로운 점을 발견할 수 있습니다. Name이 null인 문서도 조회 결과에 포함되었습니다. 이는 MongoDB에서 $exists: true가 필드의 '키' 존재 여부만 확인하기 때문입니다. 즉, 필드에 null 값이 저장되어 있어도 해당 키가 문서 안에 있다면 $exists 조건을 통과합니다.
반대로 네 번째 문서처럼 Name 필드 자체가 아예 없는 경우에는 $exists: true 조건에 걸러져 제외됩니다. 만약 null 값을 완전히 배제하고 싶다면 {"Name": {"$exists": true, "$ne": "", "$type": "string"}}처럼 $type 조건을 추가로 활용하는 방법도 고려할 수 있습니다.
정리
- $exists: 필드(키)의 존재 여부를 판단하며, 값이 null이어도 키가 있으면 true로 처리됩니다.
- $ne: 지정한 값과 일치하지 않는 문서를 반환합니다.
- 두 연산자를 $and로 조합하면 '필드가 존재하면서 빈 문자열이 아닌' 문서를 효율적으로 필터링할 수 있습니다.