$eq
$eq
指定等价条件。The
$eq
运算符匹配字段值等于指定值的文档。
兼容性
您可以使用$eq
用于以下环境中的部署
MongoDB Atlas:云中MongoDB部署的完全托管服务
MongoDB Enterprise:基于订阅的、自管理的MongoDB版本
MongoDB Community:源代码可用、免费使用和自管理的MongoDB版本
语法
$eq
运算符具有以下形式
{ <field>: { $eq: <value> } }
指定$eq
运算符等价于使用以下格式{ field: <value> }
,除非<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> } }
与用户提供的输入一起使用,以避免恶意构造的查询问题。
示例
以下示例查询 库存
集合中的以下文档
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" ] } ] )
等于指定值
以下示例查询 库存
集合,以选择所有 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"
的文档。要在嵌入文档的字段上指定条件,请使用 点符号。
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"
的元素的文档。
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" 的文档。 |
等于一个数组值
以下示例查询 库存
集合,以选择所有 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" } ]