Computer >> 컴퓨터 >  >> 프로그래밍 >> MongoDB

MongoDB에서 $exists 연산자로 특정 필드가 포함된 문서 찾는 방법

MongoDB에서 $exists 연산자로 특정 필드가 포함된 문서 찾기

MongoDB에서 특정 필드가 존재하는 문서만 조회하고 싶다면 $exists 연산자를 사용하면 됩니다. 이 연산자는 지정한 필드가 문서 안에 실제로 존재하는지 여부를 판단하여 조건에 맞는 문서만 반환합니다.

이번 글에서는 예제 컬렉션을 만들고, 배열 내부의 필드 존재 여부를 기준으로 문서를 조회하는 과정을 단계별로 살펴보겠습니다.

1단계: 컬렉션 생성 및 문서 삽입

먼저 demo247이라는 컬렉션을 만들고 클라이언트 정보가 담긴 문서 네 개를 삽입합니다. 여기서 일부 문서에는 ClientLastName 필드가 있고, 일부에는 없다는 점에 주목하세요.

> db.demo247.insertOne({"ClientDetails":[{"ClientFirstName":"Chris","ClientAge":34}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b2a31627c0c63e7dba69")
}
> db.demo247.insertOne({"ClientDetails":[{"ClientFirstName":"John","ClientLastName":"Smith","ClientAge":31}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b2be1627c0c63e7dba6a")
}
> db.demo247.insertOne({"ClientDetails":[{"ClientFirstName":"David","ClientAge":33}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b2cd1627c0c63e7dba6b")
}
> db.demo247.insertOne({"ClientDetails":[{"ClientFirstName":"David","ClientLastName":"Miller","ClientAge":31}]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e46b2de1627c0c63e7dba6c")
}

2단계: 전체 문서 확인하기

find() 메서드와 pretty()를 함께 사용하면 컬렉션의 모든 문서를 보기 좋게 출력할 수 있습니다.

> db.demo247.find().pretty();

위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.

{
   "_id" : ObjectId("5e46b2a31627c0c63e7dba69"),
   "ClientDetails" : [
      {
         "ClientFirstName" : "Chris",
         "ClientAge" : 34
      }
   ]
}
{
   "_id" : ObjectId("5e46b2be1627c0c63e7dba6a"),
   "ClientDetails" : [
      {
         "ClientFirstName" : "John",
         "ClientLastName" : "Smith",
         "ClientAge" : 31
      }
   ]
}
{
   "_id" : ObjectId("5e46b2cd1627c0c63e7dba6b"),
   "ClientDetails" : [
      {
         "ClientFirstName" : "David",
         "ClientAge" : 33
      }
   ]
}
{
   "_id" : ObjectId("5e46b2de1627c0c63e7dba6c"),
   "ClientDetails" : [
      {
         "ClientFirstName" : "David",
         "ClientLastName" : "Miller",
         "ClientAge" : 31
      }
   ]
}

3단계: $exists로 특정 필드가 있는 문서만 조회하기

이제 ClientDetails.ClientLastName 필드가 존재하는 문서만 골라내는 쿼리를 실행해 보겠습니다. 점 표기법(dot notation)으로 배열 내부의 하위 필드 경로를 지정하고, 값으로 true를 설정하면 해당 필드를 가진 문서만 반환됩니다.

> db.demo247.find({"ClientDetails.ClientLastName":{$exists:true}});

실행 결과는 다음과 같습니다.

{
   "_id" : ObjectId("5e46b2be1627c0c63e7dba6a"), "ClientDetails" : [
      { "ClientFirstName" : "John", "ClientLastName" : "Smith", "ClientAge" : 31 }
   ]
}
{
   "_id" : ObjectId("5e46b2de1627c0c63e7dba6c"), "ClientDetails" : [
      { "ClientFirstName" : "David", "ClientLastName" : "Miller", "ClientAge" : 31 }
   ]
}

결과 분석 및 핵심 정리

출력 결과를 보면 네 개의 문서 중 ClientLastName 필드를 가진 두 개의 문서(John Smith, David Miller)만 반환된 것을 확인할 수 있습니다. Chris와 David의 첫 번째 문서처럼 성(last name) 정보가 없는 문서는 결과에서 제외됩니다.

핵심을 정리하면 다음과 같습니다.

- $exists: true — 해당 필드가 존재하는 문서만 조회합니다.
- $exists: false — 반대로 해당 필드가 없는 문서만 조회할 수도 있습니다.
- 점 표기법 — 배열이나 내장 문서(embedded document) 내부의 필드도 "상위필드.하위필드" 형태로 접근할 수 있습니다.

이처럼 $exists 연산자는 스키마가 유연한 MongoDB 환경에서 데이터 품질 검증이나 조건부 조회에 매우 유용하게 활용됩니다.