📜  MongoDB - 正则表达式

📅  最后修改于: 2022-05-13 01:56:58.381000             🧑  作者: Mango

MongoDB - 正则表达式

MongoDB 提供了通过编写正则表达式在查询期间在字符串中搜索模式的功能。正则表达式是一种将模式与字符序列匹配的通用方法。 MongoDB 使用 Perl 兼容正则表达式 (PCRE) 版本 8.42 以及 UTF-8 支持。在 MongoDB 中,我们可以通过两种不同的方式进行模式匹配:

  • 使用 $regex 运算符
  • 没有 $regex 运算符

使用 $regex运算符模式匹配

此运算符为查询中的模式匹配字符串提供正则表达式功能。或者换句话说,此运算符用于在指定集合中搜索给定字符串。当我们不知道我们在文档中查找的确切字段值时,这会很有帮助。例如,一个包含 3 个文档的集合,即

{
name: "Tony",
position: "Backend developer"
}  
{
name: "Bruce",
position: "frontend developer"
}  
{
name: "Nick",
position: "HR Manager"
} 

我们正在寻找开发者信息。因此,在 $regex运算符的帮助下,我们创建了一个模式(即 {position: {$regex: “developer”}}),该模式将仅返回那些包含 developer 字符串 的文档。

要点:

  • 不允许在 $in 运算符使用 $regex运算符符。
  • 如果要在以逗号分隔的查询条件列表中添加正则表达式,则必须使用 $regex运算符。
  • 如果要使用 x 和 s 选项,则必须使用带有 $options 的 $regex运算符表达式。
  • 从 MongoDB 的最新版本(即 4.0.7)开始,您可以将 $not运算符与 $regex运算符表达式一起使用。
  • 对于区分大小写的正则表达式查询,如果指定字段的索引可用,则 MongoDB 将正则表达式与索引中的值进行匹配。这是匹配而不是扫描所有集合的最简单方法对于不区分大小写的正则表达式查询,它们没有有效地利用索引。
  • 如果你想使用 Perl 兼容的正则表达式支持 JavaScript 不支持的正则表达式,那么你必须使用 $regex 运算符。

句法:



{ : { $regex: /pattern/, $options: '' } }
{ : { $regex: 'pattern', $options: '' } }

$选项:

在 MongoDB 中,以下 可用于正则表达式:

  • i:匹配字符串中的小写和大写模式。
  • m:在匹配的模式中包含 ^ 和 $ ,即专门搜索字符串的^ 和 $ 。如果没有这个选项,这些锚在字符串的开头或结尾匹配。
  • x:忽略 $regex 模式中的所有空白字符。
  • s:允许点字符“.”以匹配所有字符,包括字符。

例子:

在以下示例中,我们正在使用:



  • 显示在其职位字段中包含“开发人员”一词的员工的详细信息:
db.employee.find({position : {$regex : "developer"}}).pretty()

在这里,我们将显示职位字段包含开发人员字符串的员工的文档。因此,我们使用 $regex运算符(即 {$regex : “developer”})为 find() 方法中的位置字段传递正则表达式。

  • 使用 i 显示不区分大小写的软件工程师员工的详细信息:
db.employee.find({position:{$regex:"software",$options:"$i"}}).pretty()

在这里,我们将显示那些职位字段包含不区分大小写的“软件”字符串的员工的文档。因此,我们为 find() 方法中的位置字段传递一个带有选项的正则表达式(即 {$regex : “software”, $options: “$i”})。在正则表达式中,$options:”$i” 用于匹配给定字符串(即“software”)中的小写和大写模式。

  • 显示姓名以 B 开头的员工的详细信息:
db.employee.find({Name:{$regex:"^B"}}).pretty()

在这里,我们将显示姓名以“B”字母开头的员工的文档。因此,我们使用 $regex运算符(即 {$regex : “^B”})为 find() 方法中的 Name 字段传递正则表达式。

  • 显示姓名以 e 结尾的员工的详细信息:
db.employee.find({Name:{$regex:"e$"}}).pretty()

在这里,我们将显示姓名以“e”字母结尾的员工的文档。因此,我们使用 $regex运算符(即 {$regex : “e$”})为 find() 方法中的 Name 字段传递正则表达式。

不使用 $regex运算符的模式匹配

在 MongoDB 中,我们可以在不使用 $regex运算符的情况下进行模式匹配。简单来说,就是通过使用一个正则表达式对象来指定一个正则表达式。此外,通过使用正则表达式对象,您可以在 $ in 运算符使用正则表达式。

句法:



{ : /pattern/ }

这里,// 表示在这些分隔符之间指定您的搜索条件。

例子:

在以下示例中,我们正在使用:

  • 使用正则表达式对象显示姓名中包含“te”一词的员工的详细信息:
db.employee.find({Name: /te/}).pretty()

在这里,我们将显示姓名中包含“te”字符串的员工的文档。因此,我们在 find() 方法中为 Name 字段传递一个正则表达式(即 {Name: /te/})。在此正则表达式中,// 表示在这些分隔符之间指定您的搜索条件,即 /te/。