본문 바로가기
MongoDB/Logical Query Operators

[MongoDB] $and, $nor, $or

by 드름이 2022. 6. 30.

요약

- 배열로 주어지는 하나 이상의 표현식 모두가 참인 document를 모두 가져오고 싶을 때 $and 사용

- 배열로 주어지는 하나 이상의 표현식 모두가 거짓인 document를 모두 가져오고 싶을 때 $nor 사용

- 배열로 주어지는 둘 이상의 표현식 중 적어도 하나가 참인 document를 모두 가져오고 싶을 때 $or 사용

 


1. $and 

 

inventory collection에서 가격이 1.99와 같지 않고, 가격 필드가 존재하는 document를 모두 가져옵니다. 

 

db.inventory.find( { $and: [ { 가격: { $ne: 1.99 } }, { 가격: { $exists: true } } ] } )

 

아래 구문으로 축약할 수도 있습니다. 훨씬 간결해보이네요.

 

db.inventory.find( { 가격: { $ne: 1.99, $exists: true } } )

 

 

 


다른 logical query operator를 사용한 표현식도 사용될 수 있습니다.

 

수량이 10보다 작거나 50보다 큰 동시에, 판매중이거나 가격이 5 미만인 document를 가져옵니다. 

 

db.inventory.find( {
    $and: [
        { $or: [ { 수량: { $lt : 10 } }, { 수량 : { $gt: 50 } } ] },
        { $or: [ { 판매중: true }, { 가격 : { $lt : 5 } } ] }
    ]
} )

 


2. $nor  

 

 

$and와 대우 관계로 작동합니다.


3. $or  

 

수량이 20보다 작거나 가격이 10인 document를 모두 가져옵니다.

 

db.inventory.find( { $or: [ { 수량: { $lt: 20 } }, { 가격: 10 } ] } )

 


 

$or 공식 문서에는 index와 관련된 내용이 기록되어있습니다. 

 

$or에 주는 조항들( 위에서는 [ { 수량: ... } , { 가격: ... } ] )이 평가될 때, MongoDB는 아래 두 방식 중 하나를 수행합니다.

- collection scan

- index scans (모든 조항에 index가 지원되는 경우)

 


 

다시 말해서,

 

MongoDB가 $or 조항들을 평가하는데 index를 사용하기위해서는 모든 조항들에 index가 지원되어야 합니다.

그렇지 않으면 collection scan을 수행합니다.  

 

 

따라서, index scan을 하려면 아래와 같이 index를 생성해줍니다.

db.inventory.createIndex( { 수량: 1 } )
db.inventory.createIndex( { 가격: 1 } )

 


 

그렇다면 collection scan과 index scans의 차이는 무엇일까요?

 

...

 


 

 

 

출처: $and — MongoDB Manual , $nor — MongoDB Manual$or — MongoDB Manual

'MongoDB > Logical Query Operators' 카테고리의 다른 글

[MongoDB] $not  (0) 2022.06.30