定義
$exists$exists演算子は、フィールド値がnullであるドキュメントを含む、指定されたフィールドを含む、または含まないドキュメントと一致させます。注意
MongoDB
$existsは SQL 演算子existsに対応するものではありません。existsSQLについては、「$in演算子」を参照してください。Atlas Search
existsについては、Atlas ドキュメントにある既存の(MongoDB Search 演算子)演算子を参照してください。
互換性
次の環境でホストされる配置には $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に保存されているデータには、 クエリを実行中中に Atlas Search が存在する( MongoDB Search 演算子) $search演算子を使用できます。の後に $exists$search$searchを実行するのは、 exists(MongoDB Search 演算子) 演算子を使用して を実行中よりパフォーマンスが低くなります。
この演算子の Atlas Search バージョンの詳細については、Atlas ドキュメントの「MongoDB Search 演算子」演算子を参照してください。
例
存在し、かつ等しくない
次の例で考えてみます。
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 または欠落しているフィールドのクエリ」を参照してください。
$exists のパフォーマンス向上のための Sparse Index の使用
次のシナリオは最適ではありません。コレクションのすべてのドキュメントが検査されるためです。
クエリを使用してドキュメントを検索またはカウントする
field: { $exists: true }を使用し、かつfieldが 以外のsparse indexを持っているか、 または インデックスが ない 場合。
パフォーマンスを向上させるには、次のシナリオに示すように、field にsparse indexを作成します。
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 のドキュメントはカウントされません。