$eq
$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>
が正規表現の場合、ステートメントは $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" ] } ]
埋め込みドキュメントのフィールドが一定の値と等しい
次の例では inventory
コレクションに対してクエリを実行し、item
ドキュメント内の name
フィールドの値が "ab"
と等しいすべてのドキュメントを選択します。埋め込みドキュメントのフィールドで条件を指定するには、ドット表記を使用します。
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" ] } ]
配列要素が値と等しい
次の例では、inventory
コレクションに対してクエリを実行し、値が"B"
[1] となる要素を tags
配列に含むすべてのドキュメントを選択します。
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
配列が指定した配列と完全に等しいか、または 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" } ]