MongoDB에서 문서 안에 여러 필드가 모두 존재하는지 확인해야 하는 경우가 종종 있습니다. 이럴 때 $exists 연산자를 $and 연산자와 함께 사용하면 됩니다. 이 글에서는 실제 예제를 통해 그 방법을 단계별로 살펴보겠습니다.
1. 샘플 컬렉션 생성
먼저 insertOne() 메서드를 사용하여 테스트용 컬렉션에 문서를 삽입합니다.
> db.demo475.insertOne({"StudentFirstName":"Chris","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80c113b0f3fa88e2279088")
}
> db.demo475.insertOne({"StudentFirstName":"Bob","StudentAge":21,"StudentCountryName":"US"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80c127b0f3fa88e2279089")
}
> db.demo475.insertOne({"StudentFirstName":"David","StudentAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e80c135b0f3fa88e227908a")
}
여기서 주목할 점은 세 개의 문서 중 두 번째 문서(Bob)만 StudentCountryName 필드를 가지고 있다는 것입니다. 이 차이가 뒤에서 쿼리 결과를 결정하게 됩니다.
2. 저장된 문서 확인
find() 메서드를 사용하여 컬렉션의 모든 문서를 조회합니다.
> db.demo475.find();
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e80c113b0f3fa88e2279088"), "StudentFirstName" : "Chris", "StudentAge" : 23 }
{ "_id" : ObjectId("5e80c127b0f3fa88e2279089"), "StudentFirstName" : "Bob", "StudentAge" : 21, "StudentCountryName" : "US" }
{ "_id" : ObjectId("5e80c135b0f3fa88e227908a"), "StudentFirstName" : "David", "StudentAge" : 22 }
3. $and와 $exists로 여러 필드 존재 확인하기
이제 StudentFirstName, StudentAge, StudentCountryName 세 필드가 모두 존재하는 문서만 조회하는 쿼리를 작성해 보겠습니다.
> db.demo475.find(
... { '$and':
... [ { 'StudentFirstName': { '$exists': true } },
... { 'StudentAge': { '$exists': true } },
... { 'StudentCountryName': { '$exists': true } } ]
... }
... );
실행 결과는 다음과 같습니다.
{ "_id" : ObjectId("5e80c127b0f3fa88e2279089"), "StudentFirstName" : "Bob", "StudentAge" : 21, "StudentCountryName" : "US" }
결과 분석
세 가지 조건을 모두 만족하는 문서는 Bob의 문서 하나뿐입니다. Chris와 David의 문서에는 StudentCountryName 필드가 없기 때문에 결과에서 제외되었습니다. 이처럼 $and 배열 안에 각 필드의 $exists: true 조건을 나열하면, 해당 필드들을 모두 포함하는 문서만 정확히 걸러낼 수 있습니다.
참고: 암시적 AND 조건으로 더 간결하게 작성하기
MongoDB에서는 $and를 명시적으로 사용하지 않아도 쿼리 객체에 여러 조건을 나열하면 자동으로 AND 조건으로 처리됩니다. 따라서 위 쿼리는 다음과 같이 더 간결하게 작성할 수도 있습니다.
> db.demo475.find({
... 'StudentFirstName': { '$exists': true },
... 'StudentAge': { '$exists': true },
... 'StudentCountryName': { '$exists': true }
... });
두 방식 모두 동일한 결과를 반환합니다. 다만 서로 다른 필드에 여러 조건을 걸 때는 암시적 AND로 충분하지만, 같은 필드에 여러 조건을 적용하거나 조건 로직이 복잡해지는 경우에는 명시적인 $and를 사용하는 것이 가독성과 유지보수 측면에서 더 좋습니다.