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

MongoDB에서 $exists 연산자로 true/false 값 기준 문서 조회하기

MongoDB에서 특정 필드의 존재 여부(true/false)를 기준으로 문서를 조회하려면 find() 메서드와 함께 $exists 연산자를 사용하면 됩니다. 배열 내부의 중첩된 필드를 검색할 때는 점 표기법(dot notation)을 활용해야 합니다.

이 글에서는 실제 예제를 통해 $exists 연산자를 사용하는 방법을 단계별로 살펴보겠습니다.

1. 샘플 컬렉션 생성

먼저 예제에 사용할 문서들을 담은 컬렉션을 생성합니다.

> db.demo367.insertOne(
...     { "Id" : "102",
...     "details" : [ { "Name" : "David"},
...     { "Age" : 23, "CountryName" : "UK"} ],
...     "isMarried" : false }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e57e0b62ae06a1609a00ae8")
}
> db.demo367.insertOne(
...     { "Id" : "101",
...     "details" : [ { "Name" : "Chris", "Subject" : [ "MySQL" ] },
...     { "Age" : 21, "CountryName" : "US"} ],
...     "isMarried" : true }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e57e0be2ae06a1609a00ae9")
}

위 예제에서는 두 개의 문서를 삽입했습니다. 첫 번째 문서(David)의 details 배열에는 Subject 필드가 없고, 두 번째 문서(Chris)에는 Subject 필드가 존재한다는 점이 핵심입니다.

2. 컬렉션의 전체 문서 확인

find() 메서드를 사용하여 컬렉션에 저장된 모든 문서를 출력해 보겠습니다.

> db.demo367.find();

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

{
    "_id" : ObjectId("5e57e0b62ae06a1609a00ae8"), "Id" : "102", "details" : [
        { "Name" : "David" }, { "Age" : 23, "CountryName" : "UK" } ], "isMarried" : false }
{
    "_id" : ObjectId("5e57e0be2ae06a1609a00ae9"), "Id" : "101", "details" : [
        { "Name" : "Chris", "Subject" : [ "MySQL" ] }, { "Age" : 21, "CountryName" : "US" } ], "isMarried" : true 
}

3. $exists 연산자로 조건 조회

이제 $exists 연산자를 사용하여 특정 필드가 존재하지 않는(false) 문서만 조회하는 쿼리를 작성해 보겠습니다. 여기서는 점 표기법을 통해 details 배열 안의 Subject 필드를 기준으로 검색합니다.

> db.demo367.find({"details.Subject": { $exists: false}});

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

{ "_id" : ObjectId("5e57e0b62ae06a1609a00ae8"), "Id" : "102", "details" : [ { "Name" : "David" }, { "Age" : 23, "CountryName" : "UK" } ], "isMarried" : false }

결과 분석

쿼리 결과를 보면 Subject 필드가 없는 David의 문서(Id: 102)만 반환된 것을 확인할 수 있습니다.

  • $exists: false — 해당 필드가 존재하지 않는 문서를 조회합니다.
  • $exists: true — 반대로 해당 필드가 존재하는 문서를 조회할 때 사용합니다.
  • 점 표기법(details.Subject) — 배열 내부 객체의 필드를 지정할 때 사용하며, 배열 요소 중 하나라도 조건에 맞으면 해당 문서가 반환됩니다.

이처럼 $exists 연산자와 점 표기법을 조합하면 중첩된 구조의 문서에서도 원하는 필드의 유무를 손쉽게 판별하여 조회할 수 있습니다.