MongoDB에서 특정 필드가 문서에 존재하는지 확인하고 싶다면 $exists 연산자와 $ne 연산자를 함께 사용하면 됩니다. 이 두 연산자를 조합하면 단순히 필드가 있는지뿐만 아니라, 필드가 존재하면서 동시에 null 값이 아닌 경우까지 정확하게 조회할 수 있습니다.
개념을 더 잘 이해하기 위해 먼저 샘플 컬렉션을 만들고 문서를 삽입해 보겠습니다. 아래 쿼리로 컬렉션을 생성할 수 있습니다.
> db.checkFieldExistDemo.insertOne({"EmployeeId":1,"EmployeeName":"John","isMarried":true,"EmployeeSalary":4648585});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c76f7b31e9c5dd6f1f78281")
}
> db.checkFieldExistDemo.insertOne({"StudentId":2,"StudentName":"John","isMarried":false,"StudentAge":19});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c76f7e11e9c5dd6f1f78282")
}이제 find() 메서드를 사용해 컬렉션의 모든 문서를 조회해 보겠습니다.
> db.checkFieldExistDemo.find().pretty();
출력 결과
{
"_id" : ObjectId("5c76f7b31e9c5dd6f1f78281"),
"EmployeeId" : 1,
"EmployeeName" : "John",
"isMarried" : true,
"EmployeeSalary" : 4648585
}
{
"_id" : ObjectId("5c76f7e11e9c5dd6f1f78282"),
"StudentId" : 2,
"StudentName" : "John",
"isMarried" : false,
"StudentAge" : 19
}위 출력 결과에서 볼 수 있듯이 첫 번째 문서는 직원 정보(Employee)를, 두 번째 문서는 학생 정보(Student)를 담고 있으며, 두 문서 모두 isMarried 필드를 공통으로 가지고 있습니다.
그럼 MongoDB에서 필드의 존재 여부를 확인하는 실제 쿼리를 살펴보겠습니다.
Case 1 – 여러 문서에 필드가 존재하는 경우
두 문서 모두에 존재하는 isMarried 필드를 조회하는 쿼리입니다. $exists:true로 필드의 존재를 확인하고, $ne:null로 값이 null이 아닌 경우만 걸러냅니다.
> db.checkFieldExistDemo.find({"isMarried":{$exists:true,$ne:null}}).pretty();출력 결과
{
"_id" : ObjectId("5c76f7b31e9c5dd6f1f78281"),
"EmployeeId" : 1,
"EmployeeName" : "John",
"isMarried" : true,
"EmployeeSalary" : 4648585
}
{
"_id" : ObjectId("5c76f7e11e9c5dd6f1f78282"),
"StudentId" : 2,
"StudentName" : "John",
"isMarried" : false,
"StudentAge" : 19
}isMarried 필드가 두 문서 모두에 존재하기 때문에 전체 문서가 반환되었습니다.
Case 2 – 하나의 문서에만 필드가 존재하는 경우
이번에는 두 번째 문서에만 존재하는 StudentName 필드를 조회해 보겠습니다.
> db.checkFieldExistDemo.find({"StudentName":{$exists:true,$ne:null}}).pretty();출력 결과
{
"_id" : ObjectId("5c76f7e11e9c5dd6f1f78282"),
"StudentId" : 2,
"StudentName" : "John",
"isMarried" : false,
"StudentAge" : 19
}StudentName 필드는 두 번째 문서에만 존재하므로 해당 문서 하나만 반환되었습니다.
정리
MongoDB에서 필드 존재 여부를 확인할 때는 {"필드명": {$exists:true, $ne:null}} 패턴을 사용하는 것이 가장 안전합니다. $exists:true만 사용하면 값이 명시적으로 null로 저장된 문서도 포함될 수 있기 때문에, 실무에서는 $ne:null을 함께 사용해 의도하지 않은 결과를 방지하는 것이 좋습니다.