MongoDB에서 특정 필드가 문서에 존재하는지 확인하려면 $exists 연산자를 사용해야 합니다. 이 연산자는 쿼리 조건에 포함된 필드가 해당 컬렉션의 문서 안에 실제로 있는지 여부를 판별하는 데 유용합니다.
테스트용 컬렉션 생성하기
먼저 예제 문서들을 담은 컬렉션을 생성해 보겠습니다.
> db.determineFieldExistsDemo.insertOne({"ClientName":"John"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb245d628fa4220163b75")
}
> db.determineFieldExistsDemo.insertOne({"ClientName":"Larry","ClientAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb25cd628fa4220163b76")
}
> db.determineFieldExistsDemo.insertOne({"ClientName":"Mike","ClientCountryName":"UK"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb26fd628fa4220163b77")
}
> db.determineFieldExistsDemo.insertOne({"ClientName":"Sam","ClientAge":24});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9eb286d628fa4220163b78")
}위 예제에서는 네 개의 문서를 삽입했습니다. 각 문서마다 포함된 필드가 다르다는 점에 주목하세요. John의 문서에는 ClientName만 있고, Larry와 Sam의 문서에는 ClientAge가, Mike의 문서에는 ClientCountryName이 포함되어 있습니다.
컬렉션의 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.determineFieldExistsDemo.find().pretty();
위 쿼리는 다음과 같은 결과를 출력합니다.
{ "_id" : ObjectId("5c9eb245d628fa4220163b75"), "ClientName" : "John" }
{
"_id" : ObjectId("5c9eb25cd628fa4220163b76"),
"ClientName" : "Larry",
"ClientAge" : 23
}
{
"_id" : ObjectId("5c9eb26fd628fa4220163b77"),
"ClientName" : "Mike",
"ClientCountryName" : "UK"
}
{
"_id" : ObjectId("5c9eb286d628fa4220163b78"),
"ClientName" : "Sam",
"ClientAge" : 24
}$exists 연산자로 필드 존재 여부 확인하기
이제 특정 필드가 존재하는지 확인하는 쿼리를 살펴보겠습니다. ClientCountryName 필드가 있는 문서만 조회하려면 다음과 같이 작성합니다.
> db.determineFieldExistsDemo.find({ClientCountryName:{$exists:true}}).pretty();위 쿼리의 실행 결과는 다음과 같습니다.
{
"_id" : ObjectId("5c9eb26fd628fa4220163b77"),
"ClientName" : "Mike",
"ClientCountryName" : "UK"
}결과를 보면 ClientCountryName 필드를 가진 문서는 Mike의 문서 하나뿐입니다. 나머지 문서들은 해당 필드가 없기 때문에 결과에서 제외되었습니다.
참고: 반대 경우도 가능합니다
$exists 값으로 false를 지정하면 특정 필드가 존재하지 않는 문서만 조회할 수 있습니다. 예를 들어 {ClientAge: {$exists: false}}를 사용하면 ClientAge 필드가 없는 문서들만 반환됩니다. 또한 MongoDB에서는 필드가 존재하더라도 값이 null인 경우와 필드 자체가 없는 경우가 서로 다르게 처리되므로, 정확한 조건 설계 시 이 점을 함께 고려하는 것이 좋습니다.