$exists
項目一覧
定義
$exists
$exists
演算子は、フィールド値がnull
であるドキュメントを含む、指定されたフィールドを含む、または含まないドキュメントと一致させます。
互換性
次の環境でホストされる配置には $exists
を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$exists
式を指定するには、次のプロトタイプを使用します。
{ field: { $exists: <boolean> } }
<boolean>
が true の場合、 $exists
は、フィールド値がnull
であるドキュメントを含む、 フィールドを含むドキュメントと一致します。 <boolean>
が false の場合、クエリは フィールドを 含んでいない ドキュメントのみを返します。 [ 1 ]
[1] | クエリフィルター $type: 0 を $exists:false の同義語として使用できなくなりました。null または欠落しているフィールドをクエリするには、「null または欠落しているフィールドのクエリ」を参照してください。 |
Atlas Search を使用した Atlas 上のデータのクエリ
MongoDB Atlas に保存されているデータには、$search
クエリを実行中に Atlas Search の exists 演算子を使用できます。$search
の後に $exists
を実行するのは、$search
を exists 演算子とともに実行する場合よりパフォーマンスが低くなります。
この演算子の Atlas Search バージョンの詳細については、Atlas ドキュメントのexists演算子を参照してください。
例
存在し、かつ等しくない
次の例で考えてみます。
db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )
このクエリは、qty
フィールドが存在し、かつその値が 5
または 15
と等しくない inventory
コレクション内のすべてのドキュメントを選択します。
Null Values
次の例では、以下のドキュメントを含む spices
という名前のコレクションを使用します。
db.spices.insertMany( [ { saffron: 5, cinnamon: 5, mustard: null }, { saffron: 3, cinnamon: null, mustard: 8 }, { saffron: null, cinnamon: 3, mustard: 9 }, { saffron: 1, cinnamon: 2, mustard: 3 }, { saffron: 2, mustard: 5 }, { saffron: 3, cinnamon: 2 }, { saffron: 4 }, { cinnamon: 2, mustard: 4 }, { cinnamon: 2 }, { mustard: 6 } ] )
$exists: true
次のクエリでは、クエリ述語 saffron: { $exists: true }
を指定します。
db.spices.find( { saffron: { $exists: true } } )
結果は、フィールド saffron
を含むドキュメントで構成されます。これには、フィールド saffron
に null 値が含まれるドキュメントも含まれます。
{ saffron: 5, cinnamon: 5, mustard: null } { saffron: 3, cinnamon: null, mustard: 8 } { saffron: null, cinnamon: 3, mustard: 9 } { saffron: 1, cinnamon: 2, mustard: 3 } { saffron: 2, mustard: 5 } { saffron: 3, cinnamon: 2 } { saffron: 4 }
$exists: false
次のクエリでは、クエリ述語 cinnamon: { $exists: false }
を指定します。
db.spices.find( { cinnamon: { $exists: false } } )
結果は、フィールド cinnamon
を含まないドキュメントで構成されます。
{ saffron: 2, mustard: 5 } { saffron: 4 } { mustard: 6 }
クエリフィルター $type: 0
を $exists:false
の同義語として使用できなくなりました。null または欠落しているフィールドをクエリするには、「null または欠落しているフィールドのクエリ」を参照してください。
Sparse Index を使用した$exists
パフォーマンスの向上<a class=\" \" href=\" \" title=\" \"><svg xmlns=\" \" width=\" \" height=\" \" fill=\" \" viewbox=\" \" class=\" \" role=\" \" aria-label=\" \"><path fill=\" \" d=\" \"> <path fill=\" \" d=\" \">
次の表は、スパース インデックスと非スパース インデックスを使用した $exists
クエリのパフォーマンスを比較したものです。
$exists クエリ | スパース インデックスの使用 | Using a Non-Sparse Index |
---|---|---|
{ $exists: true } | 最も効率的です。MongoDB は完全一致を実現できるため、 FETCH は必要ありません。 | インデックスのないクエリよりも効率的ですが、 FETCH が必要です。 |
{ $exists: false } | インデックスを使用できず、 COLLSCAN が必要です。 | FETCH が必要です。 |
非スパース インデックスを使用しているフィールドで { $exists: true }
を使用するクエリ、およびインデックスがないフィールドで { $exists: true }
を使用するクエリは、コレクション内のすべてのドキュメントを検索します。パフォーマンスを向上させるには、次のシナリオに示すように、field
にスパース インデックスを作成します。
stockSales
コレクションを作成します。db.stockSales.insertMany( [ { _id: 0, symbol: "MDB", auditDate: new Date( "2021-05-18T16:12:23Z" ) }, { _id: 1, symbol: "MDB", auditDate: new Date( "2021-04-21T11:34:45Z" ) }, { _id: 2, symbol: "MSFT", auditDate: new Date( "2021-02-24T15:11:32Z" ) }, { _id: 3, symbol: "MSFT", auditDate: null }, { _id: 4, symbol: "MSFT", auditDate: new Date( "2021-07-13T18:32:54Z" ) }, { _id: 5, symbol: "AAPL" } ] ) 次の
_id
を持つドキュメント。3
のauditDate
値が null。5
のauditDate
値がない。
auditDate
フィールドにスパース インデックスを作成します。db.getCollection( "stockSales" ).createIndex( { auditDate: 1 }, { name: "auditDateSparseIndex", sparse: true } ) 次の例では、
auditDate
フィールドに値(null を含む)があり、スパース インデックスを使用しているドキュメントをカウントします。db.stockSales.countDocuments( { auditDate: { $exists: true } } ) この例では 5 が返されます。
auditDate
値が欠落しているドキュメントはカウントされません。
Tip
field
の値が null でないドキュメントだけが必要な場合は、次のようにします。
$exists: true
の代わりに$ne: null
を使用できます。field
にはスパース インデックスは必要ありません。
たとえば、 stockSales
コレクションを使用する場合は次のようになります。
db.stockSales.countDocuments( { auditDate: { $ne: null } } )
この例では 4 を返します。auditDate
値が欠落しているドキュメントや auditDate
値が null のドキュメントはカウントされません。