MongoDB에서 특정 필드 이름을 기준으로 문서를 조회하려면 $exists 연산자를 사용하면 됩니다. 이 연산자는 지정한 필드가 문서 안에 존재하는지 여부를 판단하여, 조건에 맞는 문서만 반환해 줍니다. 스키마가 유연한 MongoDB의 특성상 문서마다 가지고 있는 필드가 다를 수 있기 때문에, 이런 방식의 조회는 실무에서 매우 자주 활용됩니다.
아래 예제를 통해 컬렉션 생성부터 필드 존재 여부 기반 조회까지 단계별로 살펴보겠습니다.
1. 컬렉션 생성 및 문서 삽입
먼저 findByFieldName이라는 컬렉션을 만들고 테스트용 문서 두 개를 삽입합니다. 첫 번째 문서는 클라이언트의 프로젝트 정보(ClientProjectDetails)를 포함하고, 두 번째 문서는 교육 정보(ClientEducationDetails)를 포함하도록 서로 다른 구조로 구성했습니다.
> db.findByFieldName.insertOne({ "Client": { "ClientDetails": { "ClientName": "Larry", "ClientAge": 29 }, "ClientProjectDetails": { "ProjectName": "Online Book Store", "TeamSize": 10, "TechnologyUsed": "Spring Boot" } } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9e93b2d628fa4220163b64")
}> db.findByFieldName.insertOne({
... "Client": {
... "ClientDetails": {
... "ClientName": "Chris",
... "ClientAge": 27
... },
... "ClientEducationDetails": {
... "isEducated": true,
... "CollegeName": "M.I.T."
... }
... }
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9e9421d628fa4220163b65")
}2. 컬렉션의 전체 문서 확인하기
find() 메서드와 pretty()를 함께 사용하면 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 수 있습니다.
> db.findByFieldName.find().pretty();
실행 결과는 다음과 같습니다. 두 문서 모두 공통적으로 Client.ClientDetails 필드를 가지고 있지만, 하나는 ClientProjectDetails를, 다른 하나는 ClientEducationDetails를 포함하고 있는 점에 주목하세요.
{
"_id" : ObjectId("5c9e93b2d628fa4220163b64"),
"Client" : {
"ClientDetails" : {
"ClientName" : "Larry",
"ClientAge" : 29
},
"ClientProjectDetails" : {
"ProjectName" : "Online Book Store",
"TeamSize" : 10,
"TechnologyUsed" : "Spring Boot"
}
}
}
{
"_id" : ObjectId("5c9e9421d628fa4220163b65"),
"Client" : {
"ClientDetails" : {
"ClientName" : "Chris",
"ClientAge" : 27
},
"ClientEducationDetails" : {
"isEducated" : true,
"CollegeName" : "M.I.T."
}
}
}3. $exists 연산자로 특정 필드 기준 조회하기
이제 Client.ClientProjectDetails 필드가 존재하는 문서만 조회해 보겠습니다. 중첩된 필드를 대상으로 할 때는 점(.) 표기법으로 경로를 지정한다는 점에 유의하세요.
> db.findByFieldName.find({ "Client.ClientProjectDetails": { $exists: true } }).pretty();실행 결과, ClientProjectDetails 필드를 가진 첫 번째 문서(Larry)만 반환됩니다.
{
"_id" : ObjectId("5c9e93b2d628fa4220163b64"),
"Client" : {
"ClientDetails" : {
"ClientName" : "Larry",
"ClientAge" : 29
},
"ClientProjectDetails" : {
"ProjectName" : "Online Book Store",
"TeamSize" : 10,
"TechnologyUsed" : "Spring Boot"
}
}
}추가 팁: 필드가 존재하지 않는 문서 조회하기
반대로 특정 필드가 존재하지 않는 문서를 찾고 싶다면 $exists 값을 false로 설정하면 됩니다.
> db.findByFieldName.find({ "Client.ClientProjectDetails": { $exists: false } }).pretty();이 쿼리는 ClientEducationDetails만 가진 두 번째 문서(Chris)를 반환합니다.
정리
$exists 연산자는 MongoDB에서 필드의 존재 여부를 기준으로 문서를 필터링할 때 사용하는 핵심 도구입니다. 점 표기법과 함께 사용하면 중첩된 하위 필드도 손쉽게 검사할 수 있으며, true/false 값을 조절해 필드가 있는 문서와 없는 문서를 모두 조회할 수 있습니다. 유동적인 스키마를 다루는 MongoDB 환경에서 데이터 정합성을 확인하거나 조건부 조회를 수행할 때 적극적으로 활용해 보시기 바랍니다.