$eq等価条件を指定します。
$eq演算子は、フィールドの値が指定された値と等しいドキュメントを一致させます。
互換性
次の環境でホストされる配置には $eq を使用できます。
MongoDB Atlas はクラウドでの MongoDB 配置のためのフルマネージド サービスです
MongoDB Enterprise: サブスクリプションベースの自己管理型 MongoDB バージョン
MongoDB Community: ソースが利用可能で、無料で使用できる自己管理型の MongoDB のバージョン
構文
$eq演算子は次のような形をとります。
{ <field>: { $eq: <value> } }
$eq演算子は、 <value>が正規式である場合を除き、 { field: <value> }形式と同等です。例については、以下を参照してください。
動作
比較の順序
異なる BSON 型値の比較については、BSON 比較順序の指定を参照してください。
ドキュメントの値に一致
<value> がドキュメントの場合、ドキュメント内のフィールドの順序が重要になります。
配列の値に一致する
<value> が配列の場合、MongoDB は <field> が配列に完全一致するか、または <field> に配列と完全一致する要素が含まれるドキュメントを一致させます。要素の順序は重要な意味を持ちます。例については、「配列の値に等しい」を参照してください。
正規表現に一致する
式 { field: <value> } は暗黙的に <value> との一致を指定します。MongoDB では暗黙的な一致はより明示的な形式に変換されます。
<value>が特定の文字列のように固定されている場合、その式は$eq演算子{ field: { $eq: <value> } }を使用する場合と同じになります。
<value>が正規表現であれば、MongoDBは$regex演算子を用いてステートメントを展開します{ field: { $regex: <value> } }。
例については、正規表現の一致動作。を参照してください。
セキュリティへの影響
悪意を持って作成されたクエリで問題が発生しないように、ユーザーからの入力には必ず明示的な形式 { field: { $eq: <value> } } を使用してください。
例
例では、inventory コレクションを使用しています。
db.inventory.insertMany( [ { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] }, { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] } ] )
指定された値に等しい
この例では、inventory コレクション内のすべてのドキュメントを選択します。このとき、qty フィールドの値が 20 に等しい場合です。
db.inventory.find( { qty: { $eq: 20 } } )
このクエリは下記と同等です。
db.inventory.find( { qty: 20 } )
どちらのクエリも、次のドキュメントと一致します。
[ { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] } ]
埋め込みドキュメントのフィールドが一定の値と等しい
次の例では、item.nameフィールドの値が"ab"に等しいinventoryコレクション内のすべてのドキュメントを選択します。埋め込みドキュメントのフィールドで条件を指定するには、ドット表記を使用します。
db.inventory.find( { "item.name": { $eq: "ab" } } )
このクエリは下記と同等です。
db.inventory.find( { "item.name": "ab" } )
どちらのクエリも次のドキュメントと一致します。
[ { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] } ]
配列要素が値と等しい
次の例は、tags の配列に値"B" [1] の要素が含まれる、inventory コレクション内のすべてのドキュメントを選択します:
db.inventory.find( { tags: { $eq: "B" } } )
このクエリは下記と同等です。
db.inventory.find( { tags: "B" } )
どちらのクエリも、次のドキュメントと一致します。
[ { _id: 1, item: { name: "ab", code: "123" }, qty: 15, tags: [ "A", "B", "C" ] }, { _id: 2, item: { name: "cd", code: "123" }, qty: 20, tags: [ "B" ] }, { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 4, item: { name: "xy", code: "456" }, qty: 30, tags: [ "B", "A" ] } ]
| [1] | このクエリは、 tags フィールドの値が文字列"B" となるドキュメントにも一致します。 |
配列の値に等しい
この例では、inventory コレクション内のすべてのドキュメントを選択します。ここで、tags 配列が指定された配列と等しいか、または配列 [ "A", "B" ] に等しい要素が含まれている場合です。
db.inventory.find( { tags: { $eq: [ "A", "B" ] } } )
このクエリは下記と同等です。
db.inventory.find( { tags: [ "A", "B" ] } )
どちらのクエリも、次のドキュメントと一致します。
[ { _id: 3, item: { name: "ij", code: "456" }, qty: 25, tags: [ "A", "B" ] }, { _id: 5, item: { name: "mn", code: "000" }, qty: 20, tags: [ [ "A", "B" ], "C" ] } ]
正規表現一致の動作
次の例は、暗黙的な正規式の一致と明示的な正規式の一致の違いを示しています。次のドキュメントを含むコレクションについて考えてみます。
db.companies.insertMany( [ { _id: 001, company: "MongoDB" }, { _id: 002, company: "MongoDB2" } ] )
- $eq 文字列に一致
暗黙的な一致を使用しても、
$eqを明示的に使用しても、文字列は同じ値を返します。次のクエリは同じ結果を返します。db.collection.find( { company: "MongoDB" }, {_id: 0 }) db.collection.find( { company: { $eq: "MongoDB" } }, {_id: 0 } ) 結果は:
[ { company: "MongoDB" } ] - 正規表現での一致 $eq
$eqと正規表現を使用する明示的なクエリは、同じく正規表現であるオブジェクトのみと一致します。この例のクエリでは、companyフィールドの値が文字列であるため、結果が返されません。db.companies.find( { company: { $eq: /MongoDB/ } }, {_id: 0 } ) - 正規表現の一致
正規式に対して暗黙的に一致するクエリは、
$regex演算子を使用するクエリと同等です。次のクエリは同じ結果を返します。db.companies.find( { company: /MongoDB/ }, {_id: 0 }) db.companies.find( { company: { $regex: /MongoDB/ } }, {_id: 0 } ) 結果は以下のとおりです。
[ { company: "MongoDB" }, { company: "MongoDB2" } ]