$or$orは、1つ以上の式の配列でORの論理演算を実行し、少なくとも1つの式を満たすドキュメントを選択します。
互換性
次の環境でホストされる配置には $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 に 1 つのインデックスを作成し、year にもう 1 つのインデックスを作成します。
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 およびソート操作
を使用して$or sort()クエリを実行する場合、MongoDB は$or 句をサポートするインデックスを使用できます。
$or および部分インデックス
$orを使用して部分インデックス を作成できます。db.collection.createIndex()メソッドのpartialFilterExpressionを使用して部分インデックスを作成します。
$or と $in
$or を同じフィールドの値の等価性チェックである <expressions> と使用する場合は、$or ではなく $in を使用します。
このクエリは、year が 1903 または 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 句
$or 操作をネストできます。
Error Handling
クエリ エンジンでクエリが最適化されるよう、$or はエラーを次のように処理します。
$orに指定した式が単独で評価されるとエラーが発生する場合、その式を含む$orでエラーが発生することがありますが、必ずしもエラーが発生するわけではありません。$orに最初に指定した式の後に式を指定すると、最初の式がtrueと評価されていてもエラーが発生することがあります。