$or$orはOR1 つ以上の式の配列に対して論理 操作を実行し、少なくとも 1 つの式を満たすドキュメントを選択します。
互換性
次の環境でホストされる配置には $or を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$or演算子の構文は次のとおりです。
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
次の例で考えてみます。
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
このクエリは、quantity フィールド値が 20 未満であるか、または price フィールド値が 10 に等しいinventory コレクション内のすべてのドキュメントを選択します。
動作
$or 句とインデックス
$or式の句を評価する際、 MongoDB はコレクションスキャンまたはインデックススキャンを実行します。すべての句がインデックスでサポートされている場合、 MongoDB はインデックススキャンを実行します。インデックスを使用して$or 式を評価するには、 式のすべての句がインデックスでサポートされている必要があります。それ以外の場合、 MongoDB$or はコレクションスキャンを実行します。
$orクエリでインデックスを使用する場合、$or の各句は独自のインデックスを使用できます。次のクエリを考えてみましょう。
db.inventory.find( { $or: [ { quantity: { $lt: 20 } }, { price: 10 } ] } )
このクエリをサポートするには、複合インデックスではなく、quantity に 1 つのインデックスを作成し、price にもう 1 つのインデックスを作成します。
db.inventory.createIndex( { quantity: 1 } ) db.inventory.createIndex( { price: 1 } )
$or and text Queries
$or$textに$or クエリが含まれている場合、 配列内のすべての句はインデックスでサポートされている必要があります。これは、$text クエリではインデックスを使用する必要があり、$or ではすべての句がインデックスでサポートされている場合のみインデックスを使用できるためです。$text クエリがインデックスを使用できない場合、クエリはエラーを返します。
注意
$text は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。
$or および地理空間クエリ
$or は、地理空間句をサポートします。ただし、near 句($near または $nearSphere)を使用する場合、 $or は他の句を含めることはできません。単一の句で $or を使用すると、$or 演算子を省略する場合と同じ効果が得られます。
たとえば、次のクエリは $or 演算子が $near を他の句と組み合わせているため無効です。
db.places.find( { $or: [ { location: { $near: [ 40, 5 ] } }, { category: "restaurant" } ] } )
次のクエリは、$or が非近接地理空間句($geoIntersects)を使用しているため有効です。
db.places.find( { $or: [ { location: { $geoIntersects: { $geometry: { type: "Polygon", coordinates: [ [ [ 39, 4 ], [ 41, 4 ], [ 41, 6 ], [ 39, 4 ] ] ] } } } }, { category: "restaurant" } ] } )
$or およびソート操作
を使用して$or sort()クエリを実行する場合、MongoDB は$or 句をサポートするインデックスを使用できます。
$or および部分インデックス
$orを使用して部分インデックス を作成できます。db.collection.createIndex()メソッドのpartialFilterExpressionを使用して部分インデックスを作成します。
$or Compared to $in
$or<expressions>同じフィールドの値の等価性チェックである$in $orとともに を使用する場合は、 ではなく を使用します。
このクエリは、quantity が 20 または 50 である inventoryコレクション内のドキュメントを選択します。
db.inventory.find ( { quantity: { $in: [20, 50] } } )
Nested $or Clauses
$or操作をネストできます。
Error Handling
クエリ エンジンでクエリが最適化されるよう、$or はエラーを次のように処理します。
$orに指定した式が単独で評価されるとエラーが発生する場合、その式を含む$orでエラーが発生することがありますが、必ずしもエラーが発生するわけではありません。$orに最初に指定した式の後に式を指定すると、最初の式がtrueと評価されていてもエラーが発生することがあります。
たとえば、次のクエリでは、 $x が 0 の場合、常にエラーが発生します。
db.example.find( { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } )
$or に複数の式を指定した次のクエリでは、$x が 0 であるドキュメントがある場合にエラーが発生することがあります。
db.example.find( { $or: [ { x: { $eq: 0 } }, { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } } ] } )