$exists
이 페이지의 내용
정의
$exists
$exists
연산자는 필드 값이null
인 문서를 포함하여 지정된 필드를 포함하거나 포함하지 않는 문서를 일치시킵니다.
호환성
다음 환경에서 호스팅되는 배포에 $exists
사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$exists
표현식을 지정하려면 다음 프로토타입을 사용합니다.
{ field: { $exists: <boolean> } }
<boolean>
이 참인 경우 $exists
은 필드 값이 null
인 문서를 포함해 필드가 포함된 문서와 일치합니다. <boolean>
이 거짓인 경우 쿼리는 해당 필드를 포함하지 않은 문서만 반환합니다. [1]
[1] | 사용자는 더 이상 쿼리 필터 $type: 0 을 $exists:false 의 동의어로 사용할 수 없습니다. null 또는 누락된 필드를 쿼리하려면 null 또는 누락된 필드 쿼리를 참조하세요. |
Atlas Search을 사용하여 Atlas에서 데이터 쿼리하기
MongoDB Atlas에 저장된 데이터의 경우 $search
쿼리를 실행할 때 Atlas Search 존재 연산자를 사용할 수 있습니다. $search
후에 $exists
(을)를 실행하는 것은 존재 연산자와 함께 $search
(을)를 실행하는 것보다 성능이 떨어집니다.
이 연산자의 Atlas Search 버전에 대해 자세히 알아보려면 Atlas 설명서에서 존재 연산자를 참조하세요.
예시
존재 및 같지 않음
다음 예를 고려하십시오.
db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )
이 쿼리는 collection inventory
에서 필드 qty
이(가) 존재하며, 또한 해당 값이 5
또는 15
와 같지 않은 모든 문서를 선택합니다.
Null Values
다음 예에서는 다음 문서와 함께 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 } ] )
$exists: true
다음 쿼리는 쿼리 조건자 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 }
$exists: false
다음 쿼리는 쿼리 조건자 cinnamon: { $exists: false }
을(를) 지정합니다:
db.spices.find( { cinnamon: { $exists: false } } )
결과는 cinnamon
필드를 포함하지 않는 문서로 구성됩니다:
{ saffron: 2, mustard: 5 } { saffron: 4 } { mustard: 6 }
사용자는 더 이상 쿼리 필터 $type: 0
을 $exists:false
의 동의어로 사용할 수 없습니다. null 또는 누락된 필드를 쿼리하려면 null 또는 누락된 필드 쿼리를 참조하세요.
희소 인덱스를 $exists
사용하여 성능 개선
다음 표에서는 희소 인덱스와 비희소 인덱스를 사용한 $exists
쿼리 성능을 비교합니다.
$exists 쿼리 | 희소 인덱스 사용 | Using a Non-Sparse Index |
---|---|---|
{ $exists: true } | 가장 효율적입니다. MongoDB는 정확히 일치시킬 수 있으며 FETCH 이(가) 필요하지 않습니다. | 인덱스가 없는 쿼리보다 더 효율적이지만 여전히 FETCH 이(가) 필요합니다. |
{ $exists: false } | 인덱스를 사용할 수 없으며 COLLSCAN 이(가) 필요합니다. | FETCH 이(가) 필요합니다. |
희소 인덱스가 아닌 필드에 { $exists: true }
을(를) 사용하거나 인덱싱되지 않은 필드에 { $exists: true }
을(를) 사용하는 쿼리는 collection의 모든 문서를 검사합니다. 성능을 향상시키려면 다음 시나리오와 같이 field
에 희소 인덱스를 생성하십시오.
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
nullauditDate
값이 존재합니다.5
auditDate
값이 누락되었습니다.
auditDate
필드에 희소 인덱스를 만듭니다.db.getCollection( "stockSales" ).createIndex( { auditDate: 1 }, { name: "auditDateSparseIndex", sparse: true } ) 다음 예시에서는
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
값이 있는 문서는 계산되지 않습니다.