Learn the "why" behind slow queries and how to fix them in our 2-Part Webinar.
Register now >
Docs Menu
Docs Home
/ /

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

$exists

$exists演算子は、フィールド値がnullであるドキュメントを含む、指定されたフィールドを含む、または含まないドキュメントと一致させます。

注意

MongoDB$exists はSQL演算子exists に対応していません。 SQLexists については、 を参照してください。$in

Atlas Searchexists については、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 の場合、クエリはフィールドを含まないドキュメントのみを返します。

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" ドキュメントを選択します。

sample_mflixデータベースの moviesコレクションには、一部のフィールドが存在し、他のフィールドが欠落しているドキュメントが含まれています。例、ratedフィールドは11,455 ドキュメントに存在し、残りの 9,894 ドキュメントには存在しません。

次のクエリでは、クエリ述語 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' }
]

次のクエリでは、クエリ述語 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 クエリ
スパース インデックスの使用
Using a Non-Sparse Index

{ $exists: true }

最も効率的です。MongoDB は完全一致を実現できるため、 FETCH は必要ありません。

インデックスのないクエリよりも効率的ですが、 FETCH が必要です。

{ $exists: false }

インデックスを使用できず、COLLSCAN が必要です。

FETCH が必要です。

非スパース インデックスを使用しているフィールドで { $exists: true } を使用するクエリ、およびインデックスがないフィールドで { $exists: true } を使用するクエリは、コレクション内のすべてのドキュメントを検索します。パフォーマンスを向上させるには、次のシナリオに示すように、fieldスパース インデックスを作成します。

  1. moviesコレクションには、metacriticフィールドが一部のドキュメントに存在し、他のドキュメントには存在しないドキュメントが含まれています。 21、349 ドキュメントのうち、6、964 には metacriticフィールドがあり、14、385 にはありません。

  2. metacritic フィールドにスパース インデックスを作成します。

    db.movies.createIndex(
    { metacritic: 1 },
    { name: "metacriticSparseIndex", sparse: true }
    )
  3. 次の例では、metacritic フィールドに値(null を含む)があり、スパース インデックスを使用しているドキュメントをカウントします。

    db.movies.countDocuments( { metacritic: { $exists: true } } )

    この例では6964 が返されます。この操作では、metacriticフィールドが欠落しているドキュメントはカウントされません。

Tip

field の値が null でないドキュメントだけが必要な場合は、次のようにします。

たとえば、 movies コレクションを使用する場合は次のようになります。

db.movies.countDocuments( { metacritic: { $ne: null } } )

この例では6964 が返されます。 metacritic 値が欠落しているドキュメント、または metacritic 値が null のドキュメントはカウントされません。

戻る

データ型

項目一覧