요약
- 이 값들 중 하나라도 포함하는 document가 있으면 모두 가져와줘 => $in
- 이 값들 중 하나라도 포함하면 제외하고 모두 가져와줘 => $nin
- 각각 $eq와 $ne의 확장으로 볼 수 있겠습니다.
우선 inventory collection에 아래 documents를 저장한 것으로 가정합니다.
db.inventory.insertMany( [
{ "item": "펜", "수량": 350, "태그": [ "학교", "회사" ] },
{ "item": "지우개", "수량": 15, "태그": [ "학교", "집" ] },
{ "item": "지도", "태그": [ "회사", "창고" ] },
{ "item": "책", "수량": 5, "태그": [ "학교", "창고", "집" ] }
] )
1. 위의 documents에서 "수량" 필드의 값이 5 또는 15인 모든 문서를 선택합니다.
db.inventory.find( { 수량: { $in: [ 5, 15 ] } }, { _id: 0 } )
결과는 다음과 같습니다.
{ "item": "지우개", "수량": 15, "태그": [ "학교", "집" ] },
{ "item": "책", "수량": 5, "태그": [ "학교", "창고", "집" ] }
2. 참고 사항
$eq와 비슷해보였지만, $in은 한 번에 여러 값을 지정해줄 수 있는 차이가 있습니다.
좋죠? 과연 좋기만 할까요?
$in에 주는 파라미터의 개수가 늘어날수록 성능은 저하됩니다.
성능을 위해 MongoDB 공식 문서에서는 2가지 사항을 권장합니다.
- 파라미터는 수십 개로 제한해주세요 (이 정도면 충분하지 않나요?)
- 찾으려는 필드에 index를 붙여주세요
3. 배열 필드의 값을 query할 때도 1번과 동일합니다.
"태그" 필드의 배열에 "집"과 "학교" 요소를 하나라도 갖는 documents를 가져옵니다.
db.inventory.find(
{ 태그: { $in: [ "집", "학교" ] } }
)
결과는 다음과 같습니다.
{ "item": "펜", "수량": 350, "태그": [ "학교", "회사" ] },
{ "item": "지우개", "수량": 15, "태그": [ "학교", "집" ] },
{ "item": "책", "수량": 5, "태그": [ "학교", "창고", "집" ] }
4. 역시 Regex를 파라미터로 줄 수 있습니다.
5. $nin은 정반대의 결과를 가져다줍니다.
'MongoDB > Comparison Query Operators' 카테고리의 다른 글
[MongoDB] $gt, $gte, $lt, $lte (0) | 2022.06.30 |
---|---|
[MongoDB] $eq, $ne (1) | 2022.06.30 |