OR 조건이 있는 MongoDB 쿼리

Tahseen Tauseef 2023년6월20일
  1. MongoDB의 $or 연산자
  2. $or 연산자에 대한 절 및 인덱스
  3. 단일 쿼리 및 $or 연산자
  4. $or 연산자 VS $in 연산자
  5. $or 연산자를 사용한 오류 처리
OR 조건이 있는 MongoDB 쿼리

이 자습서 기사에서는 MongoDB 쿼리에서 $or 연산자를 사용하는 방법을 설명합니다.

MongoDB는 사용자에게 다양한 유형의 논리 쿼리 연산자를 제공하며 $or 연산자는 그 중 하나입니다. 이 연산자는 두 개 이상의 표현식 배열에서 논리적 OR 연산을 수행하고 배열의 지정된 표현식 중 하나 이상과 일치하는 문서만 선택하거나 검색합니다.

MongoDB의 $or 연산자

find(), update() 등과 같은 메서드에서 $or 연산자를 사용할 수 있습니다.

  1. 이 연산자를 텍스트 쿼리, GeoSpatial 쿼리 및 정렬 작업과 함께 사용할 수도 있습니다.
  2. MongoDB는 $or 표현식의 절을 평가할 때 컬렉션 스캔을 수행합니다. 인덱스가 $or 표현식의 모든 절을 지원하는 경우 MongoDB는 인덱스 스캔을 수행합니다.
  3. $or 작업을 중첩할 수도 있습니다.

$or 연산자는 두 개 이상의 표현식으로 구성된 배열에서 논리적 OR 연산을 수행하여 적어도 하나의 표현식을 충족하는 문서를 선택합니다.

통사론:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

질문:

db.inventory.find( { $or: [ { quantity: { $lt: 50 } }, { price: 20 } ] } )

수량 필드 값이 50 미만이거나 가격 필드 값이 20 미만인 인벤토리 컬렉션의 이 쿼리에서 모든 문서가 반환됩니다.

$or 연산자에 대한 절 및 인덱스

MongoDB는 $or 표현식의 절을 평가할 때 컬렉션 스캔 또는 인덱스 스캔을 수행합니다. 인덱스가 모든 절을 지원하는 경우 MongoDB는 인덱스 스캔을 수행합니다.

따라서 $or 표현식의 모든 절은 MongoDB가 명령문을 평가하는 데 사용할 인덱스에 의해 지원되어야 합니다. 그렇지 않은 경우 MongoDB는 컬렉션 스캔을 실행합니다.

$or 쿼리의 각 절은 $or 쿼리와 함께 인덱스를 사용할 때 해당 인덱스를 활용할 수 있습니다.

질문:

db.inventory.find( { $or: [ { quantity: { $lt: 50 } }, { price: 20 } ] } )

복합 인덱스 대신 수량에 대해 하나의 인덱스를 설정하고 이 쿼리를 처리하기 위해 가격에 대해 다른 인덱스를 설정합니다.

질문:

db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )

$or 절을 활성화하기 위해 MongoDB는 geoHaystack 인덱스를 제외한 모든 인덱스를 사용할 수 있습니다.

단일 쿼리 및 $or 연산자

  1. $text 쿼리 및 $or 연산자.

    $or$text 쿼리가 포함된 경우 인덱스는 $or 배열의 모든 절을 지원해야 합니다. $text 쿼리는 인덱스를 사용해야 하며 $or는 모든 절이 인덱스에서 지원되는 경우에만 인덱스를 사용할 수 있습니다.

    $text 쿼리가 인덱스를 사용할 수 없는 경우 쿼리에서 오류가 발생합니다.

  2. GeoSpatial 쿼리 및 $or 연산자.

    Near 절($nearSphere$near 포함)을 제외하고 $or는 지리적 절을 허용합니다. $or.에는 다른 절과 함께 near 절이 있을 수 없습니다.

  3. 정렬 작업 및 $or 연산자.

    이제 MongoDB는 ‘sort()‘로 ‘$or’ 쿼리를 실행할 때 $or 절을 지원하는 인덱스를 사용할 수 있습니다. 인덱스는 이전 버전의 MongoDB에서 사용되지 않았습니다.

$or 연산자 VS $in 연산자

동일한 필드의 값에 대해 동등성을 검사하는 표현식에 $or 연산자를 사용하는 대신 $in 연산자를 사용하십시오. $in 연산자를 사용하여 수량 필드 값이 40 또는 1000'재고' 컬렉션에서 모든 문서를 선택합니다.

질문:

db.inventory.find ( { quantity: { $in: [40, 1000] } } )

또한 $or 연산자를 중첩할 수 있습니다.

$or 연산자를 사용한 오류 처리

$or 연산자는 쿼리 엔진이 쿼리를 개선할 수 있도록 다음과 같은 방식으로 실수를 처리합니다.

  1. $or 연산자에 표현식이 제공되면 별도로 평가할 때 오류가 발생합니다. 표현식을 포함하는 $or 연산자는 오류를 유발할 수 있지만 이것이 보장되지는 않습니다.
  2. $or에 제공된 첫 번째 표현식이 true,로 평가되더라도 이후에 제출된 표현식은 오류를 트리거할 수 있습니다.

예를 들어 $x0,인 경우 다음 쿼리는 항상 오류를 반환합니다.

질문:

db.example.find( {
   $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )

$x의 값이 0인 문서가 있다고 가정합니다. 여기에는 $or에 전달된 여러 표현식이 포함됩니다. 다음 예에서는 오류가 발생할 수 있습니다.

질문:

db.example.find( {
   $or: [
      { x: { $eq: 0 } },
      { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
   ]
} )

이 MongoDB 자습서는 MongoDB 쿼리와 함께 $or 연산자를 사용하여 두 개 이상의 표현식으로 구성된 배열에서 논리적 OR 작업을 수행하고 적어도 하나와 일치하는 문서만 선택하거나 검색하는 방법을 알려줍니다. 배열에 주어진 표현식.

관련 문장 - MongoDB Operator