$or
$or
$or
演算子は、 1 つ以上の<expressions>
の配列に対して論理OR
操作を実行し、少なくとも1 つの<expressions>
を満たすドキュメントを選択します。
互換性
次の環境でホストされる配置には $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 はインデックススキャンを実行します。 つまり、MongoDB がインデックスを使用して$or
式を評価するには、 $or
式のすべての句がインデックスでサポートされている必要があります。 それ以外の場合、MongoDB はコレクションスキャンを実行します。
$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 } )
MongoDB は、 geoHaystackインデックスを除くすべてを使用して$or
句をサポートできます。
$or
と text
クエリ
$or
に$text
クエリが含まれている場合、$or
配列内のすべての句はインデックスによってサポートされている必要があります。これは、$text
クエリではインデックスを使用する必要があり、$or
ではすべての句がインデックスでサポートされている場合のみインデックスを使用できるためです。$text
クエリがインデックスを使用できない場合、クエリはエラーを返します。
注意
$text
は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDB Atlas でホストされているデータに対して、MongoDB は改良された全文クエリ ソリューションである Atlas Search を提供します。
$or
および地理空間クエリ
$or
は地理空間句をサポートしていますが、 near 句は次の例外があります( near 句には$nearSphere
と$near
が含まれます)。 $or
には、他の 句を持つ near 句を含めることはできません。
$or
およびソート操作
を使用して$or
sort()
クエリを実行する場合、MongoDB は$or
句をサポートするインデックスを使用できます。
$or
対 $in
$or
<expressions>
同じフィールドの値の等価性チェックである$in
とともに使用する場合は、$or
演算子ではなく 演算子を使用します。
たとえば、 quantity
フィールドの値が20
または 50
に等しい inventory
コレクション内のすべてのドキュメントを選択するには、次のように $in
演算子を使用します。
db.inventory.find ( { quantity: { $in: [20, 50] } } )
ネストされた $or
節
$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 ] } } ] } )