$regex

在本页面

  • 定义

  • 行为

  • 例子

定义

  • $regex

    • 为查询中的 pattern 匹配 strings 提供正则表达式功能。 MongoDB 使用 Perl 兼容的正则表达式(i.e.“PCRE”)version 8.41 并支持 UTF-8。

要使用$regex,请使用以下语法之一:

{ <field>: { $regex: /pattern/, $options: '<options>' } }
{ <field>: { $regex: 'pattern', $options: '<options>' } }
{ <field>: { $regex: /pattern/<options> } }

在 MongoDB 中,您还可以使用正则表达式 objects(i.e./pattern/)来指定正则表达式:

{ <field>: /pattern/<options> }

有关特定语法使用的限制,请参阅$regex 与/pattern/语法。

  • $options

以下<options>可用于正则表达式。

选项描述语法限制
i对 match 大小写不敏感。对于 example,请参阅执行 Case-Insensitive 正则表达式 Match。
m对于包含锚点的模式(i.e.^表示开头,$表示结尾),match 位于 strings 的每个 line 的开头或结尾,具有多行值。如果没有此选项,这些锚点匹配 string 的开头或结尾。对于 example,请参阅Lines 的多行 Match 从指定的 Pattern 开始。
如果 pattern 不包含锚点,或者 string value 没有换行符(e.g .\n),则m选项无效。
x除非转义或包含在字符 class 中,否则“扩展”功能可忽略$regex pattern 中的所有空格字符。
此外,它忽略字符 in-between 并包括 un-escaped hash/pound(#)字符和下一个新 line,以便您可以在复杂模式中包含 comments。这仅适用于数据字符;空格字符可能永远不会出现在 pattern 中的特殊字符 sequences 中。
x选项不影响 VT 字符的处理(i.e.code 11)。
需要$regex$options语法
s允许点字符(i.e..)匹配包括换行符在内的所有字符。对于 example,请参阅使用 。点字符 Match 新 Line。需要$regex$options语法

行为

$regex 与/pattern/语法

$in 表达式

要在$in查询表达式中包含正则表达式,只能使用 JavaScript 正则表达式 objects(i.e./pattern/)。例如:

{ name: { $in: [ /^acme/i, /^ack/ ] } }

您不能在$in中使用$regex operator 表达式。

场的隐含和条件

要在字段的 comma-separated 查询条件列表中包含正则表达式,请使用$regex operator。例如:

{ 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 选项

要使用x选项或s选项,必须将$regex operator 表达式与$options operator 一起使用。对于 example,要指定is选项,必须同时使用$options:

{ name: { $regex: /acme.*corp/, $options: "si" } }
{ name: { $regex: 'acme.*corp', $options: "si" } }

PCRE 与 JavaScript

要在 regex pattern 中使用不受 JavaScript 支持的 PCRE 支持的 features,必须将$regex operator 表达式与 pattern 一起用作 string。例如,要使用 pattern 中的(?i)为剩余的 pattern 打开 case-insensitivity 而将(?-i)打开 case-sensitivity 打开剩余的 pattern,必须将$regex operator 与 pattern 一起用作 string:

{ name: { $regex: '(?i)a(?-i)cme' } }

索引使用

对于区分大小写的正则表达式查询,如果该字段存在索引,则 MongoDB 将正则表达式与索引中的值匹配,这可能比集合扫描更快。如果正则表达式是“前缀表达式”,则可以进一步优化,这意味着所有可能的匹配都以相同的 string 开头。这允许 MongoDB 从该前缀构造一个“范围”,并且只对来自该范围内的索引的那些值进行匹配。

如果正则表达式以插入符号(^)或左键(\A)开头,后跟简单符号的 string,则它是“前缀表达式”。对于 example,将通过仅匹配以abc开头的索引中的值来优化正则表达式/^abc.*/

此外,虽然/^a//^a.*//^a.*$/ match 等效 strings,但它们具有不同的 performance 特性。如果存在适当的索引,则所有这些表达式都使用索引;但是,/^a.*//^a.*$/比较慢。 /^a/可以在匹配前缀后停止扫描。

不区分大小写的正则表达式查询通常无法有效地使用索引。 $regex implementation 不是 collation-aware,无法使用 case-insensitive 索引。

例子

以下示例使用带有以下文档的集合products

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

执行 LIKE Match

以下 example 匹配sku字段类似于"%789"的所有文档:

db.products.find( { sku: { $regex: /789$/ } } )

example 类似于以下 SQL LIKE 语句:

SELECT * FROM products
WHERE sku like "%789";

执行 Case-Insensitive 正则表达式 Match

以下 example 使用i选项对sku value 以ABC开头的文档执行 case-insensitive match。

db.products.find( { sku: { $regex: /^ABC/i } } )

该查询与以下文档匹配:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

Lines 的多行 Match 从指定的 Pattern 开始

以下 example 使用选项 match lines 以字母S开头,用于多行 strings:

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

该查询与以下文档匹配:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

如果没有m选项,查询将只匹配以下文档:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

如果$regex pattern 不包含锚点,则 pattern 与 string 作为整体匹配,如下面的 example:

db.products.find( { description: { $regex: /S/ } } )

然后,$regex将匹配两个文件:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

使用 。点字符 Match 新 Line

以下 example 使用s选项允许点字符(i.e..)匹配包括 new line 在内的所有字符以及i选项以执行 case-insensitive match:

db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )

该查询与以下文档匹配:

{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

如果没有s选项,查询将只匹配以下文档:

{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }

忽略 Pattern 中的空白区域

以下 example 使用x选项忽略空格和 comments,由#表示,以匹配 pattern 中的\n结尾:

var pattern = "abc #category code\n123 #item number"
db.products.find( { sku: { $regex: pattern, $options: "x" } } )

该查询与以下文档匹配:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }