Docs Menu
Docs Home
/ /

$or

$or

$orは、1 つ以上の式の配列に対して論理OR 操作を行い、少なくとも 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式の節を評価する際、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 } )

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

注意

$text は、自己管理型(Atlas 以外)配置に対するテキスト クエリ機能を提供します。MongoDBでホストされているデータに対して、 MongoDB は改良された全文クエリ ソリューションであるMongoDB Search も提供します。

$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 sort()クエリを実行する場合、MongoDB は$or 句をサポートするインデックスを使用できます。

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

同じフィールドの値の等価性チェックである$or <expressions>と共に使用する場合は、$inを使用してください。$orは使用しないでください。

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

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

$or操作をネストすることができます。

Tip

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

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

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

たとえば、次のクエリでは、 $x0 の場合、常にエラーが発生します。

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

$or に複数の式を指定した次のクエリでは、$x0 であるドキュメントがある場合にエラーが発生することがあります

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

戻る

$not

項目一覧