문서 메뉴

문서 홈애플리케이션 개발MongoDB 매뉴얼

$exists

이 페이지의 내용

  • 정의
  • 호환성
  • 구문
  • Atlas Search을 사용하여 Atlas에서 데이터 쿼리하기
  • 예제
  • 존재 및 같지 않음
  • Null 값
  • 희소 인덱스를 사용하여 $exists 성능 개선
$exists

$exists 연산자는 필드 값이 null 인 문서를 포함하여 지정된 필드를 포함하거나 포함하지 않는 문서와 일치합니다.

참고

MongoDB $exists 이(가) SQL 연산자 exists해당하지 않습니다. SQL exists 의 경우 $in 연산자를 참조하세요.

Atlas Search exists 의 경우 Atlas 설명서에서 exists 연산자를 참조하세요.

다음도 참조하세요.

다음 환경에서 호스팅되는 배포에 $exists 사용할 수 있습니다.

  • MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스

$exists 표현식을 지정하려면 다음 프로토타입을 사용합니다.

{ field: { $exists: <boolean> } }

<boolean> 이 true인 경우 $exists 는 필드 값이 null 인 문서를 포함하여 필드가 포함된 문서와 일치합니다. <boolean> 이(가) false이면 쿼리는 필드를 포함하지 않는 문서만 반환합니다. [1]

[1] MongoDB 4.2부터 사용자는 더 이상 쿼리 필터 $type: 0$exists:false의 동의어로 사용할 수 없습니다. null 또는 누락된 필드를 쿼리하려면 Null 또는 누락된 필드 쿼리를 참조하십시오.

MongoDB Atlas 에 저장된 데이터의 경우 쿼리를 실행할 때 Atlas Search 존재 연산자를 사용할 $search 수 있습니다. }$exists $search 다음에 를 실행하는 것은 exist 연산자를 사용하여 를 실행하는 것보다 성능 이 떨어집니다.$search

이 연산자의 Atlas Search 버전에 대해 자세히 알아보려면 Atlas 설명서에서 존재 연산자를 참조하세요.

다음 예를 고려하십시오.

db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )

이 쿼리는 collection inventory 에서 필드 qty 이(가) 존재하며, 또한 해당 값이 5 또는 15 와 같지 않은 모든 문서를 선택합니다.

다음 예에서는 다음 문서와 함께 spices라는 컬렉션을 사용합니다.

db.spices.insertMany( [
{ saffron: 5, cinnamon: 5, mustard: null },
{ saffron: 3, cinnamon: null, mustard: 8 },
{ saffron: null, cinnamon: 3, mustard: 9 },
{ saffron: 1, cinnamon: 2, mustard: 3 },
{ saffron: 2, mustard: 5 },
{ saffron: 3, cinnamon: 2 },
{ saffron: 4 },
{ cinnamon: 2, mustard: 4 },
{ cinnamon: 2 },
{ mustard: 6 }
] )

다음 쿼리는 쿼리 조건자 saffron: { $exists: true }을(를) 지정합니다:

db.spices.find( { saffron: { $exists: true } } )

결과는 saffron 필드에 null 값이 포함된 문서를 포함하여 saffron 필드가 포함된 문서로 구성됩니다.

{ saffron: 5, cinnamon: 5, mustard: null }
{ saffron: 3, cinnamon: null, mustard: 8 }
{ saffron: null, cinnamon: 3, mustard: 9 }
{ saffron: 1, cinnamon: 2, mustard: 3 }
{ saffron: 2, mustard: 5 }
{ saffron: 3, cinnamon: 2 }
{ saffron: 4 }

다음 쿼리는 쿼리 조건자 cinnamon: { $exists: false }을(를) 지정합니다:

db.spices.find( { cinnamon: { $exists: false } } )

결과는 cinnamon 필드를 포함하지 않는 문서로 구성됩니다:

{ saffron: 2, mustard: 5 }
{ saffron: 4 }
{ mustard: 6 }

MongoDB 4.2부터 사용자는 더 이상 쿼리 필터 $type: 0$exists:false의 동의어로 사용할 수 없습니다. null 또는 누락된 필드를 쿼리하려면 Null 또는 누락된 필드 쿼리를 참조하십시오.

다음 표에서는 희소 인덱스와 비희소 인덱스를 사용한 $exists 쿼리 성능을 비교합니다.

$exists 쿼리
희소 인덱스 사용
비희소 인덱스 사용
{ $exists: true }
가장 효율적입니다. MongoDB는 정확히 일치시킬 수 있으며 FETCH이(가) 필요하지 않습니다.
인덱스가 없는 쿼리보다 더 효율적이지만 여전히 FETCH 이(가) 필요합니다.
{ $exists: false }
인덱스를 사용할 수 없으며 COLLSCAN이(가) 필요합니다.
FETCH이(가) 필요합니다.

희소 인덱스가 아닌 필드에 { $exists: true } 을(를) 사용하거나 인덱싱되지 않은 필드에 { $exists: true } 을(를) 사용하는 쿼리는 collection의 모든 문서를 검사합니다. 성능을 향상시키려면 다음 시나리오와 같이 field희소 인덱스를 생성하십시오.

  1. stockSales collection을 만듭니다.

    db.stockSales.insertMany( [
    { _id: 0, symbol: "MDB", auditDate: new Date( "2021-05-18T16:12:23Z" ) },
    { _id: 1, symbol: "MDB", auditDate: new Date( "2021-04-21T11:34:45Z" ) },
    { _id: 2, symbol: "MSFT", auditDate: new Date( "2021-02-24T15:11:32Z" ) },
    { _id: 3, symbol: "MSFT", auditDate: null },
    { _id: 4, symbol: "MSFT", auditDate: new Date( "2021-07-13T18:32:54Z" ) },
    { _id: 5, symbol: "AAPL" }
    ] )

    다음의 _id 이 포함된 문서:

    • 3 null auditDate 값이 존재합니다.

    • 5 auditDate 값이 누락되었습니다.

  2. auditDate 필드에 희소 인덱스를 만듭니다.

    db.getCollection( "stockSales" ).createIndex(
    { auditDate: 1 },
    { name: "auditDateSparseIndex", sparse: true }
    )
  3. 다음 예시에서는 auditDate 필드에 값(null 포함)이 있는 문서의 수를 계산하고 희소인덱스를사용합니다.

    db.stockSales.countDocuments( { auditDate: { $exists: true } } )

    해당 예시에서는 5를 반환합니다. auditDate 값이 누락된 문서는 계산되지 않습니다.

field 에 null이 아닌 값이 있는 문서만 필요한 경우 다음을 실시합니다.

  • $exists: true 대신 $ne: null 을(를) 사용할 수 있습니다.

  • field 에는 희소 인덱스이(가) 필요하지 않습니다.

예를 들어, stockSales collection을 사용하면 다음과 같습니다.

db.stockSales.countDocuments( { auditDate: { $ne: null } } )

이 예시에서는 4를 반환합니다. auditDate 값이 누락되었거나 null auditDate 값이 있는 문서는 계산되지 않습니다.

← 요소 쿼리 연산자
$type →