MongoDB 正则表达式 (Regex) 及其示例

正则表达式用于模式匹配,主要用于在文档中查找字符串。

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

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

这个 正则表达式运算符 MongoDB 用于在集合中搜索特定字符串。以下示例显示了如何执行此操作。

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

员工ID 员工姓名
22 纽马丁
2 Mohan
3 Joe
4 莫汉
100 Guru99
6 古朗

在下面的代码中,我们使用正则表达式运算符来指定搜索条件。

使用 $regex Opera模式匹配

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

代码说明:

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

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

输出:

使用 $regex Opera模式匹配

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

假设您的集合包含以下文档,以及一个包含员工姓名“Guru999”的附加文档。如果您输入搜索条件“Guru99”,它也会返回包含“Guru999”的文档。但假设我们不想要这个,只想返回包含“Guru99”的文档。那么我们可以使用精确模式匹配来做到这一点。要进行精确模式匹配,我们将使用 ^ 和 $ 字符。我们将在字符串开头添加 ^ 字符,在字符串结尾添加 $。

员工ID 员工姓名
22 纽马丁
2 Mohan
3 Joe
4 莫汉
100 Guru99
6 古朗
8 Guru999

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

使用 $regex Opera模式匹配

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

代码说明:

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

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

输出:

使用 $regex Opera模式匹配

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

使用 $options 进行模式匹配

使用正则表达式运算符时,还可以使用 $选项 关键字。例如,假设您想要查找员工姓名中包含“Gu”的所有文档,无论其是否区分大小写。如果想要这样的结果,那么我们需要使用 $选项 具有不区分大小写的参数。

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

假设我们有相同的员工集合,其字段名称为“Employeeid”和“EmployeeName”。

我们还假设我们的收藏中有以下文件。

员工ID 员工姓名
22 纽马丁
2 Mohan
3 Joe
4 莫汉
100 Guru99
6 古朗
7 古鲁99号

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

使用 $options 进行模式匹配

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

代码说明:

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

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

输出:

使用 $options 进行模式匹配

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

不使用正则表达式运算符的模式匹配

也可以不使用正则表达式运算符进行模式匹配。以下示例显示了如何做到这一点。

不使用正则表达式的模式匹配 Opera器

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

代码说明:

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

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

输出:

不使用正则表达式的模式匹配 Opera器

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

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

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

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

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

假设我们有相同的员工集合,其字段名称为“Employeeid”和“EmployeeName”。

我们还假设我们的收藏中有以下文件:

员工ID 员工姓名
22 纽马丁
2 Mohan
3 Joe
4 莫汉
100 Guru99
6 古朗
7 古鲁99号

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

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

代码说明:

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

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

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

输出:

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

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

备注:如果搜索的字符串长度超过 38,000 个字符,则不会显示正确的结果。

结语

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