MongoDB에서 특정 필드가 존재하는 문서를 검색하려면 $exists 연산자를 사용하면 됩니다. 이 연산자는 지정한 필드가 문서 안에 실제로 존재하는지 여부만 판단하며, 필드의 값이나 데이터 타입과는 무관하게 동작합니다. 아래에서 예제를 통해 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성하기
먼저 insertOne() 메서드를 사용해 테스트용 컬렉션에 문서 두 개를 삽입하겠습니다.
> db.findDocumentContainsSpecificFieldDemo.insertOne({"ProductPrices":{"Product1":10,"Product2":50}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cf2385bb64a577be5a2bc14")
}
> db.findDocumentContainsSpecificFieldDemo.insertOne({"ProductPrices":{"Product3":150,"Product7":100,"Product5":250}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cf2387eb64a577be5a2bc15")
}2. 전체 문서 조회하기
find() 메서드를 사용하면 컬렉션에 저장된 모든 문서를 확인할 수 있습니다.
> db.findDocumentContainsSpecificFieldDemo.find().pretty();
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
{
"_id" : ObjectId("5cf2385bb64a577be5a2bc14"),
"ProductPrices" : {
"Product1" : 10,
"Product2" : 50
}
}
{
"_id" : ObjectId("5cf2387eb64a577be5a2bc15"),
"ProductPrices" : {
"Product3" : 150,
"Product7" : 100,
"Product5" : 250
}
}3. $exists 연산자로 특정 필드 검색하기
이제 "ProductPrices.Product2" 필드가 존재하는 문서만 골라서 조회해 보겠습니다. 점 표기법으로 중첩 필드 경로를 지정하고, $exists 값에 true를 설정하면 해당 필드를 가진 문서만 반환됩니다.
> db.findDocumentContainsSpecificFieldDemo.find({"ProductPrices.Product2":{$exists:true}});실행 결과, "Product2" 필드를 포함하고 있는 첫 번째 문서만 정확히 반환된 것을 확인할 수 있습니다.
{ "_id" : ObjectId("5cf2385bb64a577be5a2bc14"), "ProductPrices" : { "Product1" : 10, "Product2" : 50 } }추가 팁
$exists에 false를 지정하면 반대로 해당 필드가 없는 문서를 조회할 수도 있습니다. 다만 대량의 데이터를 다룰 때는 $exists:false 조건이 인덱스를 효율적으로 활용하지 못해 성능 저하가 발생할 수 있으므로, 스키마 설계 단계에서 필드 존재 여부를 고려하는 것이 좋습니다.