MongoDB 从查询开始
在这篇 MongoDB 文章中,用户将学习如何使用 $regex 开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。
MongoDB 使用 $regex 开始查询
如果要使用 $regex
,请使用以下语法之一。
{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }
在 MongoDB 中,用户还可以使用正则表达式对象(即 /pattern/)来指定正则表达式。
{ <field>: /pattern/<options> }
用户可以使用带有以下 <options>
的正则表达式。
选项 | 说明 |
---|---|
i | 不区分大小写以匹配大小写。 |
m | 对于具有多行值的字符串,在每行的开头或结尾处匹配包含锚点(例如开头为 ^ 和结尾为 $)的模式。 如果模式没有锚点或者字符串值不包含换行符(例如\n),则 m 选项无效。 |
x | $regex 模式中的所有空白字符都将被忽略,除非它们被转义或包含在字符类中。 它还会忽略中间的字符并包含一个未转义的井号/井号 (#) 字符和后面的换行符,允许您以复杂的模式添加注释。 空白字符可能不会出现在模式的特殊字符序列中; 这仅适用于数据字符。 x 选项不影响 VT 字符的处理方式(即代码 11)。 它将需要 $regex 和 $options 语法 |
s | 它允许点字符 (.) 匹配任何字符,包括换行符。 需要 $regex 和 $options 语法 |
$regex 运算符不支持全局搜索修饰符 g。
$in 表达式
只有 JavaScript 正则表达式对象(即 /pattern/)可用于将正则表达式合并到 $in 查询表达式中。 考虑以下示例。
{ name: { $in: [ /^acme/i, /^ack/ ] } }
在 $in 中,您不能使用 $regex 运算符表达式。
字段的隐式 AND 条件
使用 $regex 运算符将正则表达式合并到字段的以逗号分隔的查询条件列表中。 考虑以下示例。
{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }
带有 x 和 s 的 $regex 运算符
用户应该使用 $regex 运算符和 $options 运算符来使用 x 或 s 选项。 例如,要指定 i 和 s 选项,您必须使用 $options。
{ name: { $regex: /acme.*corp/, $options: "si" } }
{ name: { $regex: 'acme.*corp', $options: "si" } }
PCRE 和 JavaScript
用户应该使用带有模式的 $regex 运算符表达式作为字符串,以在 JavaScript 中不支持的正则表达式模式中利用 PCRE 支持的功能。
例如,您必须将 $regex 运算符与模式作为字符串一起使用,以在模式中使用 (?i) 和 (?-i) 来为剩余模式打开不区分大小写。
{ name: { $regex: '(?i)a(?-i)cme' } }
$regex 和 $not
从 4.0.7 版开始,$not 运算符可以对两者执行逻辑 NOT 运算:
-
正则表达式对象(即 /pattern/)
例如:
db.inventory.find( { item: { $not: /^p.*/ } } )
-
$regex 运算符表达式(从 MongoDB 4.0.7 开始)。
例如:
db.inventory.find( { item: { $not: { $regex: "^p.*" } } } ) db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )
如果字段有索引,MongoDB 会根据索引中的值检查正则表达式,这比区分大小写的正则表达式查询的集合扫描更快。
如果正则表达式有一个前缀表达式,则可以进行更多优化,这表明所有可能的匹配都以确切的字符串开头。 这使 MongoDB 能够从前缀创建一个范围,并且只匹配该范围内的索引值。
如果正则表达式以脱字符号 (^) 或左锚点 (\A) 开头,后跟一串简单符号,则称为前缀表达式。 例如,正则表达式 /^abc.*/
将通过仅匹配以 abc 开头的索引值来优化。
此外,虽然 /^a/
、/^a.*/
和 /^a.*$/
都匹配可比较的字符串,但它们的性能不同。
如果存在合适的索引,所有这些表达式都会使用它; 尽管如此,/^a.*/
和 /^a.*$/
速度较慢。 匹配前缀后,/^a/
可以停止搜索。
不区分大小写的正则表达式查询无法有效地利用索引。 例如,$regex 实现不支持排序规则,因此不能使用不区分大小写的索引。
例子:
以下示例使用名为 products 的集合和以下文档。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." },
{ "_id" : 101, "ski" : "abc789", "description" : "First line\nSecond line" },
{ "_id" : 102, "ski" : "xyz456", "description" : "Many spaces before line" },
{ "_id" : 103, "ski" : "xyz789", "description" : "Multiple\nline description" }
LIKE 语句
此示例匹配 ski 字段类似于“%789”的所有文档。
db.products.find( { ski: { $regex: /789$/ } } )
该示例类似于以下 SQL LIKE 语句。
SELECT * FROM products
WHERE ski like "%789";
不区分大小写的正则表达式匹配
以下示例使用 i 选项并对 ski 值以 ABC 开头的文档执行不区分大小写的匹配。
db.products.find( { ski: { $regex: /^ABC/i } } )
查询匹配以下文档。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "ski" : "abc789", "description" : "First line\nSecond line" }
多行匹配
m 选项在以下示例中用于匹配多行字符串中以字母 S 开头的行。
db.products.find( { description: { $regex: /^S/, $options: 'm' } } )
该查询与下面给出的以下文档相匹配。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "ski" : "abc789", "description" : "First line\nSecond line" }
如果没有 m
选项,查询将只匹配以下文档。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." }
如果 $regex 模式不包含锚点,则该模式将应用于整个字符串,如以下示例所示。
db.products.find( { description: { $regex: /S/ } } )
然后,$regex
将匹配这两个文档。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "ski" : "abc789", "description" : "First line\nSecond line" }
. 匹配新行的点字符
s 选项允许点字符 (.
) 匹配所有字符,包括新行,而 i 选项允许不区分大小写的匹配。
db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )
查询匹配以下文档。
{ "_id" : 102, "ski" : "xyz456", "description" : "Many spaces before line" }
{ "_id" : 103, "ski" : "xyz789", "description" : "Multiple\nline description" }
如果没有 s 选项,查询将只匹配以下文档。
{ "_id" : 102, "ski" : "xyz456", "description" : "Many spaces before line" }
模式中的空白
在匹配模式中,x 选项忽略由 # 表示的空格和注释,并以 n:..
var pattern = "abc #category code\n123 #item number"
db.products.find( { ski: { $regex: pattern, $options: "x" } } )
查询与以下文档匹配。
{ "_id" : 100, "ski" : "abc123", "description" : "Single line description." }
相关文章
在 MongoDB Shell 中列出所有数据库
发布时间:2023/05/11 浏览次数:75 分类:MongoDB
-
交互式 Mongo Shell 提供了多个用于获取数据的选项。 本文介绍了在 Mongo Shell 中列出数据库的几种不同方法。
MongoDB 中检查字段包含的字符串
发布时间:2023/05/11 浏览次数:137 分类:MongoDB
-
这篇文章解决了如何在 MongoDB 中使用正则表达式来确定字段是否包含字符串。在 MongoDB 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。
在 MongoDB 中 upsert 更新插入
发布时间:2023/05/11 浏览次数:162 分类:MongoDB
-
在 MongoDB 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findAndModify() 操作中使用。MongoDB 中的 upsert 查询 upsert 采用单个布尔参数。
如何卸载 MongoDB
发布时间:2023/05/11 浏览次数:180 分类:MongoDB
-
要从您的计算机中卸载 MongoDB,您必须先删除 MongoDB 服务、数据库和日志文件。使用这篇 MongoDB 文章,您将能够从 Ubuntu Linux、Mac 和 Windows 卸载 MongoDB。 请务必保留数据备份,因为一旦卸载,便
在 MongoDB 中存储日期和时间
发布时间:2023/05/11 浏览次数:199 分类:MongoDB
-
本 MongoDB 教程解释了 Date() 对象是什么以及如何使用 Date() 方法对集合进行排序。 这也将帮助您找到在 MongoDB 中显示和存储日期/时间的最佳方法。
MongoDB 按 ID 查找
发布时间:2023/05/11 浏览次数:139 分类:MongoDB
-
MongoDB 中的 find by Id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 ID 匹配的文档,则返回空值。
检查 MongoDB 服务器是否正在运行
发布时间:2023/05/11 浏览次数:127 分类:MongoDB
-
这篇 MongoDB 教程将告诉您如何检查是否安装了 MongoDB 以及安装的 MongoDB 服务器的版本。 它在 Windows、UBUNTU 和 MAC 等不同的操作系统中实现。
MongoDB 中的分页
发布时间:2023/05/11 浏览次数:140 分类:MongoDB
-
这篇文章将介绍什么是 MongoDB 中的分页。 为什么在 MongoDB 中需要分页以及在 MongoDB 中完成分页的不同方法或方式是什么。
MongoDB 中带有 OR 条件的查询
发布时间:2023/05/11 浏览次数:88 分类:MongoDB
-
$or 运算符用于对由两个或多个表达式组成的数组执行逻辑或运算,并仅选择或检索与数组中给定的至少一个表达式匹配的文档。MongoDB 中的 $or 运算符