定義
$exists$exists演算子は、フィールド値がnullであるドキュメントを含む、指定されたフィールドを含む、または含まないドキュメントと一致させます。注意
MongoDB
$existsはSQL演算子existsに対応していません。 SQLexistsについては、 を参照してください。$inAtlas Search
existsについては、Atlas ドキュメントで「が存在する(MongoDB Search 演算子) 」を参照してください。
互換性
次の環境でホストされる配置には $exists を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
注意
式 は $exists 演算子をサポートしていません。式にフィールドの存在を確認するには、$type 集計演算子を使用してフィールドのタイプが missing であるかどうかを確認します。
詳細については、$type の有無のチェック を参照してください。
構文
$exists式を指定するには、次のプロトタイプを使用します。
{ field: { $exists: <boolean> } }
<boolean> が true の場合、$exists はフィールド値が null であるドキュメントを含む、フィールドを含むドキュメントと一致させます。<boolean> が false の場合、クエリはフィールドを含まないドキュメントのみを返します。
Atlas Search を使用した Atlas 上のデータのクエリ
MongoDB Atlasに保存されているデータには、 クエリを実行中中に Atlas Search が存在する( MongoDB Search 演算子) $search演算子を使用できます。の後に $exists$search$searchを実行するのは、 exists(MongoDB Search 演算子) 演算子を使用して を実行中よりパフォーマンスが低くなります。
この演算子の Atlas Search バージョンの詳細については、Atlas ドキュメントの「MongoDB Search 演算子」演算子を参照してください。
例
このページの例では、sample_mflixサンプルデータセットのデータを使用します。このデータセットを自己管理型MongoDB配置にロードする方法の詳細については、サンプルデータセットをロードする を参照してください。サンプルデータベースに変更を加えた場合、このページの例を実行するには、データベースを削除して再作成する必要がある場合があります。
存在し、かつ等しくない
次の例で考えてみます。
db.movies.find( { rated: { $exists: true, $nin: [ "R", "PG-13" ] } } ).limit(5)
このクエリは、5 moviesratedフィールドが存在し、その値が"R" または と等しくない コレクション内の"PG-13" ドキュメントを選択します。
Null Values
sample_mflixデータベースの moviesコレクションには、一部のフィールドが存在し、他のフィールドが欠落しているドキュメントが含まれています。例、ratedフィールドは11,455 ドキュメントに存在し、残りの 9,894 ドキュメントには存在しません。
$exists: true
次のクエリでは、クエリ述語 rated: { $exists: true } を指定します。
db.movies.find( { rated: { $exists: true } }, { _id: 0, title: 1, rated: 1 } ).limit( 3 )
結果は、フィールドrated を含む 3 つのドキュメントで構成されています。
[ { title: 'The Great Train Robbery', rated: 'TV-G' }, { title: 'A Corner in Wheat', rated: 'G' }, { title: 'Traffic in Souls', rated: 'TV-PG' } ]
$exists: false
次のクエリでは、クエリ述語 rated: { $exists: false } を指定します。
db.movies.find( { rated: { $exists: false } }, { _id: 0, title: 1, year: 1 } ).limit( 3 )
結果は、フィールドrated を含まない 3 つのドキュメントで構成されています。
[ { title: 'Winsor McCay, the Famous Cartoonist of the N.Y. Herald and His Moving Comics', year: 1911 }, { title: 'Gertie the Dinosaur', year: 1914 }, { title: 'In the Land of the Head Hunters', year: 1914 } ]
スパース インデックスを使用して $exists のパフォーマンスを向上させる
次の表は、スパース インデックスと非スパース インデックスを使用した $exists クエリのパフォーマンスを比較したものです。
$exists クエリ | スパース インデックスの使用 | Using a Non-Sparse Index |
|---|---|---|
| 最も効率的です。MongoDB は完全一致を実現できるため、 | インデックスのないクエリよりも効率的ですが、 |
| インデックスを使用できず、 |
|
非スパース インデックスを使用しているフィールドで { $exists: true } を使用するクエリ、およびインデックスがないフィールドで { $exists: true } を使用するクエリは、コレクション内のすべてのドキュメントを検索します。パフォーマンスを向上させるには、次のシナリオに示すように、field にスパース インデックスを作成します。
moviesコレクションには、metacriticフィールドが一部のドキュメントに存在し、他のドキュメントには存在しないドキュメントが含まれています。 21、349 ドキュメントのうち、6、964 にはmetacriticフィールドがあり、14、385 にはありません。metacriticフィールドにスパース インデックスを作成します。db.movies.createIndex( { metacritic: 1 }, { name: "metacriticSparseIndex", sparse: true } ) 次の例では、
metacriticフィールドに値(null を含む)があり、スパース インデックスを使用しているドキュメントをカウントします。db.movies.countDocuments( { metacritic: { $exists: true } } ) この例では6964 が返されます。この操作では、
metacriticフィールドが欠落しているドキュメントはカウントされません。
Tip
field の値が null でないドキュメントだけが必要な場合は、次のようにします。
$exists: trueの代わりに$ne: nullを使用できます。fieldにはスパース インデックスは必要ありません。
たとえば、 movies コレクションを使用する場合は次のようになります。
db.movies.countDocuments( { metacritic: { $ne: null } } )
この例では6964 が返されます。 metacritic 値が欠落しているドキュメント、または metacritic 値が null のドキュメントはカウントされません。