MongoDB/Element Query Operators
[MongoDB] $exists
드름이
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의 탐색 매커니즘에 대한 내용은 나중에 자세히 다뤄보고 싶습니다.