MongoDB에서 배열 내부 요소처럼 특정 필드가 존재하지 않는 문서만 골라내야 하는 경우가 종종 있습니다. 이럴 때 $exists 연산자를 활용하면 해당 필드의 존재 여부를 손쉽게 확인할 수 있으며, 조건과 일치하는 문서를 find() 또는 애그리게이션 파이프라인으로 조회할 수 있습니다.
1. 테스트용 컬렉션 생성하기
먼저 예제로 사용할 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 예시에서는 'Info' 배열 안의 일부 객체에 'Age' 필드가 없도록 구성했습니다.
> db.demo612.insertOne({id:1,"Info":[{Name:"Chris",Age:21},{Name:"David"}]});{
"acknowledged" : true, "insertedId" : ObjectId("5e987372f6b89257f5584d87")
}2. 저장된 문서 확인하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.demo612.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5e987372f6b89257f5584d87"),
"id" : 1,
"Info" : [
{
"Name" : "Chris",
"Age" : 21
},
{
"Name" : "David"
}
]
}3. 특정 필드가 없는 문서 조회하기
'Age' 필드가 포함되어 있지 않은 데이터를 찾으려면 애그리게이션 파이프라인에서 $unwind로 배열을 분해한 뒤, $match와 $exists: false 조건을 함께 사용하면 됩니다. 마지막으로 $project를 통해 원하는 필드만 출력하도록 지정합니다.
> db.demo612.aggregate({$unwind: "$Info"},
... {$match: {"Info.Age":{$exists: false}}},
... {$project: {"Info.Name": 1}})위 쿼리를 실행하면 'Age' 필드가 없는 요소만 다음과 같이 출력됩니다.
{ "_id" : ObjectId("5e987372f6b89257f5584d87"), "Info" : { "Name" : "David" } }정리
이처럼 $exists 연산자와 애그리게이션 단계($unwind, $match, $project)를 조합하면, 배열 내부의 특정 필드가 누락된 문서나 요소를 정확하게 필터링할 수 있습니다. 단순 최상위 필드 검사가 필요하다면 find() 메서드에 { "필드명": { $exists: false } } 조건만 넣어주면 되므로 상황에 맞게 활용하시기 바랍니다.