Docs Menu
Docs Home
/ /

$or (쿼리 자 연산자)

$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 표현식의 절을 평가할 때, 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 쿼리가 인덱스를 사용할 수 없으면 오류를 반환합니다.

참고

$text 이 페이지에서는 자체 관리형(Atlas에서 관리하지 않는) 배포를 위한 일반 텍스트 쿼리 기능을 제공합니다. MongoDB Atlas에서 호스팅되는 데이터의 경우 MongoDB는 향상된 전체 텍스트 쿼리 솔루션인 Atlas Search를 제공합니다.

$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
]
}
}
}
]

sort()를 사용하여 $or 쿼리를 실행할 때 MongoDB는 $or 절을 지원하는 인덱스를 사용할 수 있습니다.

$or을 사용하여 부분 인덱스를 생성할 수 있습니다. db.collection.createIndex() 메서드의 partialFilterExpression을 사용하여 부분 인덱스를 생성하세요.

$or <expressions> 같은 필드의 값에 대한 등호 검사와 함께 $in을 사용할 경우, $or 대신 사용하세요.

이 쿼리는 movies 컬렉션에서 문서를 선택합니다. 여기서 year1903 또는 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 은 다음과 같이 오류를 처리합니다:

  • $or에 제공된 표현식이 단독으로 평가될 때 오류가 발생하는 경우, 표현식이 포함된 $or이 오류를 일으킬 수 있지만 오류가 보장되지는 않습니다.

  • $or에 제공된 첫 번째 표현식 뒤에 제공된 표현식은 첫 번째 표현식이 true로 평가되더라도 오류를 일으킬 수 있습니다.

돌아가기

$not

이 페이지의 내용