OR 条件を使用した MongoDB クエリ

Tahseen Tauseef 2023年6月20日
  1. MongoDB の $or 演算子
  2. $or 演算子の句とインデックス
  3. 単一クエリと $or 演算子
  4. $or 演算子 VS $in 演算子
  5. $or 演算子によるエラー処理
OR 条件を使用した MongoDB クエリ

このチュートリアル記事では、MongoDB クエリで $or 演算子を使用する方法について説明します。

MongoDB はユーザーにさまざまなタイプの論理クエリ演算子を提供します。$or 演算子はその 1つです。 この演算子は、2つ以上の式の配列に対して論理 OR 演算を実行し、配列内の指定された式の少なくとも 1つに一致するドキュメントのみを選択または取得します。

MongoDB の $or 演算子

find()update() などのメソッドで $or 演算子を使用できます。

  1. この演算子は、テキスト クエリ、GeoSpatial クエリ、および並べ替え操作でも使用できます。
  2. MongoDB は、$or 式の句を評価するときに、コレクション スキャンを実行します。 インデックスが $or 式のすべての句をサポートしている場合、MongoDB はインデックス スキャンを実行します。
  3. $or 操作をネストすることもできます。

$or 演算子は、2つ以上の式で構成される配列に対して論理 OR 演算を実行することにより、少なくとも 1つの式を満たすドキュメントを選択します。

構文:

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

クエリ:

db.inventory.find( { $or: [ { quantity: { $lt: 50 } }, { price: 20 } ] } )

quantity フィールドの値が 50 未満、または price フィールドの値が 20 未満の在庫コレクションのすべてのドキュメントが、このクエリで返されます。

$or 演算子の句とインデックス

MongoDB は、$or 式の句を評価するときに、コレクション スキャンまたはインデックス スキャンを実行します。 インデックスがすべての句をサポートしている場合、MongoDB はインデックス スキャンを実行します。

したがって、$or 式のすべての句は、MongoDB がステートメントを評価するために使用するインデックスによってサポートされている必要があります。 そうでない場合、MongoDB はコレクション スキャンを実行します。

$or クエリでインデックスを使用する場合、$or クエリの各句はそのインデックスを利用できます。

クエリ:

db.inventory.find( { $or: [ { quantity: { $lt: 50 } }, { price: 20 } ] } )

複合インデックスの代わりに、数量用のインデックスと価格用の別のインデックスを作成して、このクエリを処理します。

クエリ:

db.inventory.createIndex( { quantity: 1 } )
db.inventory.createIndex( { price: 1 } )

$or 句を有効にするために、MongoDB は geoHaystack インデックス以外の任意のインデックスを使用できます。

単一クエリと $or 演算子

  1. $text クエリと $or 演算子。

    $or$text クエリが含まれる場合、インデックスは $or 配列のすべての句をサポートする必要があります。 $text クエリはインデックスを使用する必要があり、$or は、すべての句がインデックスでサポートされている場合にのみインデックスを使用できます。

    $text クエリがインデックスを使用できない場合、クエリはエラーを生成します。

  2. GeoSpatial クエリと $or 演算子。

    Near 節 ($nearSphere$near を含む) を除いて、$or は geographic 節を使用できます。 $or. の中で他の句と一緒に near 句を使用することはできません。

  3. ソート操作と $or 演算子。

    MongoDB は、sort()を使用して$orクエリを実行するときに、$or 句をサポートするインデックスを使用できるようになりました。 インデックスは、以前のバージョンの MongoDB では使用されていませんでした。

$or 演算子 VS $in 演算子

同じフィールドの値に対する等値チェックである式で $or 演算子を使用する代わりに、$in 演算子を使用します。 $in 演算子を使用して、'inventory' コレクション内の quantity フィールド値が 40 または 1000 であるすべてのドキュメントを選択します。

クエリ:

db.inventory.find ( { quantity: { $in: [40, 1000] } } )

また、$or 演算子をネストすることもできます。

$or 演算子によるエラー処理

$or 演算子は、次の方法で間違いを処理し、クエリ エンジンがクエリを改善できるようにします。

  1. $or 演算子に式を指定すると、個別に評価するとエラーが発生します。 式を含む $or 演算子はエラーを引き起こす可能性がありますが、これは保証されていません。
  2. $or に指定された最初の式が true, と評価された場合でも、その後に送信された式はエラーを引き起こす可能性があります。

たとえば、$x0, の場合、次のクエリは常にエラーを返します。

クエリ:

db.example.find( {
   $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] }
} )

$x の値が 0 で、$or に複数の式が渡されるドキュメントがあるとします。 次の例では、エラーが発生する可能性があります。

クエリ:

db.example.find( {
   $or: [
      { x: { $eq: 0 } },
      { $expr: { $eq: [ { $divide: [ 1, "$x" ] }, 3 ] } }
   ]
} )

この MongoDB チュートリアルでは、MongoDB クエリで $or 演算子を使用して、2つ以上の式で構成される配列に対して論理 OR 操作を実行し、少なくとも 1つの式に一致するドキュメントのみを選択または取得する方法について説明します。 配列で与えられた式の。

関連記事 - MongoDB Operator