드름이 2022. 7. 1. 13:43

요약: 특정 필드가 존재하는 document를 모두 가져오고 싶을 때 사용

 


{ a: 5, b: 5, c: null }
{ a: 3, b: null, c: 8 }
{ a: null, b: 3, c: 9 }
{ a: 1, b: 2, c: 3 }
{ a: 2, c: 5 }
{ a: 3, b: 2 }
{ a: 4 }
{ b: 2, c: 4 }
{ b: 2 }
{ c: 6 }

 

1. 사용법

 

위의 documents에서 qty 필드가 존재하는 모든 document를 선택합니다. 

 

db.records.find( { a: { $exists: true } } )

 

결과는 다음과 같습니다.

 

{ a: 5, b: 5, c: null }
{ a: 3, b: null, c: 8 }
{ a: null, b: 3, c: 9 }
{ a: 1, b: 2, c: 3 }
{ a: 2, c: 5 }
{ a: 3, b: 2 }
{ a: 4 }

 

$exists: false 라면 해당 필드가 없는 결과만 가져옵니다.

 


2. 성능 개선을 위해서 필드에 sparse index를 생성합니다.

 

index가 없이(또는 sparse index 없이) $exists만 사용하여 document를 검색할 때, collection의 모든 documents를 검사하게되어 성능 개선에 대한 필요성이 발생합니다.  

 

 

예제를 만들어봅시다.

 

db.stockSales.insertMany( [
   { _id: 0, 주식명: "ABC", 감사일: new Date( "2021-05-18T16:12:23Z" ) },
   { _id: 1, 주식명: "ABC", 감사일: new Date( "2021-04-21T11:34:45Z" ) },
   { _id: 2, 주식명: "DEF", 감사일: new Date( "2021-02-24T15:11:32Z" ) },
   { _id: 3, 주식명: "DEF", 감사일: null },
   { _id: 4, 주식명: "DEF", 감사일: new Date( "2021-07-13T18:32:54Z" ) },
   { _id: 5, 주식명: "XYZ" }
] )

 

위 documents 중 _id가 3, 5인 document는 "감사일" 필드의 값이 없거나 필드 자체가 없습니다.

 

 

이제 "감사일" 필드에 sparse index를 만들어봅시다.

 

db.getCollection( "stockSales" ).createIndex(
   { 감사일: 1 },
   { name: "감사일SparseIndex", sparse: true }
)

 

그러면 이제 $exists를 사용해서 검색할 때, sparse index를 사용한다고 하네요.

 


 

필수로 포함되어야 할 필드가 있다면 sparse index를 사용하여 $exists로 빠르게 존재 여부를 검사할 수 있게하면 좋을 것 같습니다.

 

 

아마도 MongoDB에서 sparse index를 우선적으로 탐색하도록 설계되어있나봅니다.

 

 

이 부분, MongoDB의 탐색 매커니즘에 대한 내용은 나중에 자세히 다뤄보고 싶습니다.


 

출처: $exists — MongoDB Manual