MongoDB 正则表达式 (Regex) 示例

正则表达式用于模式匹配,基本上是用于在文档中查找字符串。

有时,在检索集合中的文档时,您可能不知道确切的字段值来搜索。因此,可以使用正则表达式来根据模式匹配搜索值来帮助检索数据。

使用 $regex 运算符进行模式匹配

MongoDB 中的 regex 运算符用于在集合中搜索特定字符串。以下示例显示了如何执行此操作。

假设我们有相同的 Employee 集合,其中包含“Employeeid”和“EmployeeName”字段名。我们还假设我们的集合中有以下文档。

员工 ID 员工姓名
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang

在下面的代码中,我们使用了 regex 运算符来指定搜索条件。

Using $regex Operator for Pattern Matching

db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)

代码解释

  1. 在这里,我们想查找所有包含“Gu”字符的员工姓名。因此,我们指定 $regex 运算符来定义“Gu”的搜索条件。
  2. printjson 用于以更好的方式打印查询返回的每个文档。

如果命令执行成功,将显示以下输出

输出

Using $regex Operator for Pattern Matching

输出清楚地显示了返回了员工姓名包含“Gu”字符的文档。

假设您的集合包含以下文档,此外还有一个文档的员工姓名是“Guru999”。如果您输入的搜索条件是“Guru99”,它也会返回包含“Guru999”的文档。但如果我们不希望这样,只希望返回“Guru99”的文档。那么我们可以通过精确的模式匹配来实现。要进行精确的模式匹配,我们将使用 ^ 和 $ 字符。我们将在字符串的开头添加 ^ 字符,在末尾添加 $ 字符。

员工 ID 员工姓名
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
8 Guru999

以下示例显示了如何做到这一点。

Using $regex Operator for Pattern Matching

db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)

代码解释

  1. 在这里的搜索条件中,我们使用了 ^ 和 $ 字符。^ 用于确保字符串以某个字符开头,而 $ 用于确保字符串以某个字符结尾。因此,当代码执行时,它只会提取名称为“Guru99”的字符串。
  2. printjson 用于以更好的方式打印查询返回的每个文档。

如果命令执行成功,将显示以下输出

输出

Using $regex Operator for Pattern Matching

在输出中,可以清楚地看到提取了字符串“Guru99”。

带 $options 的模式匹配

当使用 regex 运算符时,还可以通过使用 **$options** 关键字提供其他选项。例如,假设您想查找员工姓名中包含“Gu”的所有文档,而不管它是区分大小写还是不区分大小写。如果需要这样的结果,那么我们需要使用带有不区分大小写参数的 **$options**。

以下示例显示了如何做到这一点。

假设我们有相同的 Employee 集合,其中包含“Employeeid”和“EmployeeName”字段名。

我们还假设我们的集合中有以下文档。

员工 ID 员工姓名
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

现在,如果我们运行与上一个主题相同的查询,我们将在结果中看不到“GURU99”的文档。为了确保它出现在结果集中,我们需要添加 $options “I” 参数。

Pattern Matching with $options

db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)

代码解释

  1. 带有“I”参数(表示不区分大小写)的 $options 指定我们要进行搜索,无论找到的是大写还是小写的“Gu”字母。

如果命令执行成功,将显示以下输出

输出

Pattern Matching with $options

  1. 输出清楚地表明,即使一个文档中的“Gu”是大写的,该文档仍然会显示在结果集中。

不带 regex 运算符的模式匹配

也可以在不使用 regex 运算符的情况下进行模式匹配。以下示例显示了如何执行此操作。

Pattern Matching without the Regex Operator

db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)

代码解释

  1. “//”选项基本上是用于在这些分隔符内指定搜索条件的。因此,我们指定 /Gu/ 来再次查找员工姓名中包含“Gu”的文档。

如果命令执行成功,将显示以下输出

输出

Pattern Matching without the Regex Operator

输出清楚地显示了返回了员工姓名包含“Gu”字符的文档。

从集合中获取最后 'n' 个文档

有多种方法可以获取集合中的最后 n 个文档。

让我们通过以下步骤来看一种方法

以下示例显示了如何做到这一点。

假设我们有相同的 Employee 集合,其中包含“Employeeid”和“EmployeeName”字段名。

我们还假设我们的集合中有以下文档

员工 ID 员工姓名
22 NewMartin
2 Mohan
3 Joe
4 MohanR
100 Guru99
6 Gurang
7 GURU99

Fetching last ‘n’ Documents from a Collection

db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)

代码解释

1) 查询文档时,使用 sort 函数按集合中 _id 字段值的降序对记录进行排序。-1 表示按降序或递减顺序对文档进行排序,以便最后一个文档成为第一个显示的文档。

2) 然后使用 limit 子句来显示您想要的记录数。这里我们将 limit 子句设置为 (2),因此它将获取最后两个文档。

如果命令执行成功,将显示以下输出

输出

Fetching last ‘n’ Documents from a Collection

输出清楚地显示了集合中的最后两个文档。因此,我们清楚地表明,要获取集合中最后 'n' 个文档,我们可以先按降序对文档进行排序,然后使用 limit 子句返回所需的 'n' 个文档。

注意:如果搜索的字符串长度大于 38,000 个字符,它将无法显示正确的结果。

摘要

  • 可以通过 $regex 运算符实现模式匹配。此运算符可用于在集合中查找特定字符串。
  • ^ 和 $ 符号可用于精确文本搜索,^ 用于确保字符串以特定字符开头,而 $ 用于确保字符串以特定字符结尾。
  • 可以将 'i' 与 $regex 运算符一起使用,以指定不区分大小写,以便无论字符串是大写还是小写都可以进行搜索。
  • 可以使用 // 分隔符进行模式匹配。
  • 结合使用 sort 和 limit 函数来返回集合中的最后 n 个文档。sort 函数可用于以降序返回文档,然后可以使用 limit 子句限制返回的文档数量。