Docs Menu
Docs Home
/ /

$or(クエリ述語演算子)

$or

$or演算子は、 1 つ以上の<expressions>の配列に対して論理OR操作を実行し、少なくとも1 つの<expressions>を満たすドキュメントを選択します。

次の環境でホストされる配置には $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 はインデックススキャンを実行します。 つまり、MongoDB がインデックスを使用して$or式を評価するには、 $or式のすべての句がインデックスでサポートされている必要があります。 それ以外の場合、MongoDB はコレクションスキャンを実行します。

$orクエリでインデックスを使用する場合、 $orの各句は独自のインデックスを使用できます。 次のクエリを考えてみましょう。

db.movies.find(
{ $or: [ { runtime: { $gt: 1000 } }, { year: { $lt: 1910 } } ] }
)

このクエリをサポートするには、複合インデックスではなく、runtime に 1 つのインデックスを作成し、year にもう 1 つのインデックスを作成します。

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

を使用して$or sort()クエリを実行する場合、MongoDB は$or 句をサポートするインデックスを使用できます。

$orを使用して部分インデックス を作成できます。db.collection.createIndex()メソッドのpartialFilterExpressionを使用して部分インデックスを作成します。

$or<expressions>同じフィールドの値の等価性チェックである$in とともに使用する場合は、$or 演算子ではなく 演算子を使用します。

このクエリは、year1903 または 1909 である movies コレクションのドキュメントを選択します。

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操作をネストできます。

Tip

クエリ エンジンでクエリが最適化されるよう、$or はエラーを次のように処理します。

  • $or に指定した式が単独で評価されるとエラーが発生する場合、その式を含む $or でエラーが発生することがありますが、必ずしもエラーが発生するわけではありません。

  • $or に最初に指定した式の後に式を指定すると、最初の式が true と評価されていてもエラーが発生することがあります。

戻る

$not

項目一覧