$or$or는 하나 이상의 표현식으로 구성된 배열에 대해 논리적OR작업을 수행하고, 표현식 중 하나 이상을 충족하는 문서를 선택합니다.
호환성
다음 환경에서 호스팅되는 배포에 $or 사용할 수 있습니다.
MongoDB Atlas: 클라우드에서의 MongoDB 배포를 위한 완전 관리형 서비스
MongoDB Enterprise: MongoDB의 구독 기반 자체 관리 버전
MongoDB Community: MongoDB의 소스 사용 가능 무료 자체 관리 버전
구문
$or 연산자의 구문은 다음과 같습니다.
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
이 페이지의 예시에서는 sample_mflix 샘플 데이터 세트의 데이터를 사용합니다. 이 데이터 세트를 자체 관리형 MongoDB 배포서버에 로드하는 방법에 대한 자세한 내용은 샘플 데이터 세트 로드를 참조하세요. 샘플 데이터베이스를 수정한 경우 이 페이지의 예시를 실행 하려면 데이터베이스를 제거하고 다시 만들어야 할 수 있습니다.
다음 예를 고려하십시오.
db.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] }, { _id: 0, title: 1, year: 1, runtime: 1 } )
[ { runtime: 11, title: 'The Great Train Robbery', year: 1903 }, { runtime: 14, title: 'A Corner in Wheat', year: 1909 }, { runtime: 1256, title: 'Centennial', year: 1978 }, { runtime: 1140, title: 'Baseball', year: 1994 }, { runtime: 1, title: 'The Kiss', year: 1896 }, { runtime: 1, title: 'The Kiss', year: 1896 } ]
이 쿼리 movies 컬렉션 에서 다음 조건 중 하나를 충족하는 모든 문서를 선택합니다.
runtime필드 값이1000보다 큽니다.year필드 값이1910보다 빠릅니다.
동작
$or 조항 및 색인
$or 표현식의 절을 평가할 때, MongoDB는 컬렉션 스캔 또는 인덱스 스캔을 수행합니다. 인덱스에서 모든 절을 지원하는 경우 MongoDB는 인덱스 스캔을 수행합니다. 인덱스를 사용하여 $or 표현식을 평가하려면 $or 표현식의 모든 절이 인덱스에서 지원되어야 합니다. 그렇지 않으면 MongoDB가 컬렉션 스캔을 수행합니다.
$or 쿼리와 함께 인덱스를 사용하는 경우 $or의 각 절은 자체 인덱스를 사용할 수 있습니다. 다음 쿼리를 고려해보세요.
db.movies.find( { $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] } )
이 쿼리 지원 하려면 복합 인덱스 대신 runtime 에 인덱스 하나를 만들고 year 에 다른 인덱스 만듭니다.
db.movies.createIndex( { runtime: 1 } ), db.movies.createIndex( { year: 1 } ),
$or 및 text 쿼리
$or에 $text 쿼리가 포함된 경우 $or 배열의 모든 절이 인덱스에서 지원되어야 합니다. 이는 $text 쿼리가 인덱스를 사용해야 하고 모든 절이 인덱스에서 지원되는 경우에만 $or가 인덱스를 사용할 수 있기 때문입니다. $text 쿼리가 인덱스를 사용할 수 없으면 오류를 반환합니다.
참고
$text 이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas Search를 제공합니다.
$or 및 지리적 공간 쿼리
$or 지리 공간적 절을 지원합니다. 그러나 near 절($near 또는 $nearSphere)를 사용하는 경우 $or에는 다른 절이 포함될 수 없습니다. $or를 단일 절과 함께 사용하면 $or 연산자를 생략한 것과 동일한 효과가 있습니다.
$or가 비근거리 지리 공간적 절($geoIntersects)을 사용하므로 다음 쿼리가 유효합니다.
db.theaters.find( { $or: [ { "location.geo": { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ -74.5, 40.5 ], [ -73.5, 40.5 ], [ -73.5, 41.0 ], [ -74.5, 40.5 ] ] ] } } } }, { "location.address.state": "NY" } ] } )
[ { _id: ObjectId('59a47287cfa9a3a73e51e92f'), theaterId: 200, location: { address: { street1: '3124 Jericho Tpke', city: 'East Northport', state: 'NY', zipcode: '11731' }, geo: { type: 'Point', coordinates: [ -73.319092, 40.838463 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51ead6'), theaterId: 345, location: { address: { street1: '148 Walt Whitman Rd', city: 'Huntington Station', state: 'NY', zipcode: '11746' }, geo: { type: 'Point', coordinates: [ -73.410637, 40.825775 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eae8'), theaterId: 374, location: { address: { street1: '2478 Central Park Ave', city: 'Yonkers', state: 'NY', zipcode: '10710' }, geo: { type: 'Point', coordinates: [ -73.826805, 40.983246 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eafd'), theaterId: 384, location: { address: { street1: '40 Catherwood Road', city: 'Ithaca', state: 'NY', zipcode: '14850' }, geo: { type: 'Point', coordinates: [ -76.492142, 42.481991 ] } } }, { _id: ObjectId('59a47287cfa9a3a73e51eb2c'), theaterId: 428, location: { address: { street1: '1 Crossgates Mall Rd', city: 'Albany', state: 'NY', zipcode: '12203' }, geo: { type: 'Point', coordinates: [ -73.848686, 42.690285 ] } } } ]
$or 및 정렬 연산
sort()를 사용하여 $or 쿼리를 실행할 때 MongoDB는 $or 절을 지원하는 인덱스를 사용할 수 있습니다.
$or 및 부분 인덱스
$or을 사용하여 부분 인덱스를 생성할 수 있습니다. db.collection.createIndex() 메서드의 partialFilterExpression을 사용하여 부분 인덱스를 생성하세요.
$or vs. $in
$or <expressions> 같은 필드의 값에 대한 등호 검사와 함께 $in을 사용할 경우, $or 대신 사용하세요.
이 쿼리는 movies 컬렉션에서 문서를 선택합니다. 여기서 year는 1903 또는 1909입니다.
db.movies.find( { year: { $in: [1903, 1909] } }, { _id: 0, title: 1, year: 1 } )
[ { title: 'The Great Train Robbery', year: 1903 }, { title: 'A Corner in Wheat', year: 1909 } ]
중첩된 $or 절
$or 작업을 중첩할 수 있습니다.
Error Handling
쿼리 엔진이 쿼리를 최적화할 수 있도록 $or 은 다음과 같이 오류를 처리합니다:
$or에 제공된 표현식이 단독으로 평가될 때 오류가 발생하는 경우, 표현식이 포함된$or이 오류를 일으킬 수 있지만 오류가 보장되지는 않습니다.$or에 제공된 첫 번째 표현식 뒤에 제공된 표현식은 첫 번째 표현식이true로 평가되더라도 오류를 일으킬 수 있습니다.