AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

$or(クエリ述語演算子)

$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 式の句を評価する場合、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 クエリがインデックスを使用できない場合、クエリはエラーを返します。

注意

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

$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" } ]} ).sort({ theaterId: 1 }).limit(5)
[ { _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 sort()クエリを実行する場合、MongoDB は$or 句をサポートするインデックスを使用できます。

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

$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 はエラーを次のように処理します。

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

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

このページを評価