MongoDB 正则表达式 (Regex) 及其示例
正则表达式用于模式匹配,主要用于在文档中查找字符串。
有时在检索集合中的文档时,您可能不知道要搜索的确切字段值。因此,可以使用正则表达式来帮助根据模式匹配搜索值检索数据。
使用 $regex 运算符进行模式匹配
这个 正则表达式运算符 MongoDB 用于在集合中搜索特定字符串。以下示例显示了如何执行此操作。
假设我们有相同的 Employee 集合,其字段名称为“Employeeid”和“EmployeeName”。还假设我们的集合中有以下文档。
员工ID | 员工姓名 |
---|---|
22 | 纽马丁 |
2 | Mohan |
3 | Joe |
4 | 莫汉 |
100 | Guru99 |
6 | 古朗 |
在下面的代码中,我们使用正则表达式运算符来指定搜索条件。
db.Employee.find({EmployeeName : {$regex: "Gu" }}).forEach(printjson)
代码说明:
- 这里我们想找到所有包含字符“Gu”的员工姓名。因此,我们指定 $regex 运算符来定义“Gu”的搜索条件
- printjson 用于以更好的方式打印查询返回的每个文档。
如果命令执行成功,将显示以下输出:
输出:
输出清楚地显示,返回了员工姓名包含“Gu”字符的那些文档。
假设您的集合包含以下文档,以及一个包含员工姓名“Guru999”的附加文档。如果您输入搜索条件“Guru99”,它也会返回包含“Guru999”的文档。但假设我们不想要这个,只想返回包含“Guru99”的文档。那么我们可以使用精确模式匹配来做到这一点。要进行精确模式匹配,我们将使用 ^ 和 $ 字符。我们将在字符串开头添加 ^ 字符,在字符串结尾添加 $。
员工ID | 员工姓名 |
---|---|
22 | 纽马丁 |
2 | Mohan |
3 | Joe |
4 | 莫汉 |
100 | Guru99 |
6 | 古朗 |
8 | Guru999 |
以下示例显示了如何做到这一点。
db.Employee.find({EmployeeName : {$regex: "^Guru99$"}}).forEach(printjson)
代码说明:
- 在搜索条件中,我们使用 ^ 和 $ 字符。 ^ 用于确保字符串以某个字符开头,而 $ 用于确保字符串以某个字符结尾。 因此,当代码执行时,它将仅获取名称为“Guru99”的字符串。
- printjson 用于以更好的方式打印查询返回的每个文档。
如果命令执行成功,将显示以下输出:
输出:
在输出中,可以清楚地看到获取了字符串“Guru99”。
使用 $options 进行模式匹配
使用正则表达式运算符时,还可以使用 $选项 关键字。例如,假设您想要查找员工姓名中包含“Gu”的所有文档,无论其是否区分大小写。如果想要这样的结果,那么我们需要使用 $选项 具有不区分大小写的参数。
以下示例显示了如何做到这一点。
假设我们有相同的员工集合,其字段名称为“Employeeid”和“EmployeeName”。
我们还假设我们的收藏中有以下文件。
员工ID | 员工姓名 |
---|---|
22 | 纽马丁 |
2 | Mohan |
3 | Joe |
4 | 莫汉 |
100 | Guru99 |
6 | 古朗 |
7 | 古鲁99号 |
现在,如果我们运行与上一个主题中相同的查询,我们将永远不会在结果中看到带有“GURU99”的文档。为了确保结果集中出现该文档,我们需要添加 $options “I” 参数。
db.Employee.find({EmployeeName:{$regex: "Gu",$options:'i'}}).forEach(printjson)
代码说明:
- 带有“I”参数的 $options(表示不区分大小写)指定无论我们找到大写还是小写的字母“Gu”,我们都要进行搜索。
如果命令执行成功,将显示以下输出:
输出:
- 输出清楚地表明,即使一个文档包含大写的“Gu”,该文档仍然会显示在结果集中。
不使用正则表达式运算符的模式匹配
也可以不使用正则表达式运算符进行模式匹配。以下示例显示了如何做到这一点。
db.Employee.find({EmployeeName: /Gu/'}).forEach(printjson)
代码说明:
- “//”选项基本上意味着在这些分隔符内指定您的搜索条件。因此,我们指定/Gu/来再次查找员工姓名中包含“Gu”的文档。
如果命令执行成功,将显示以下输出:
输出:
输出清楚地显示,返回了员工姓名包含“Gu”字符的那些文档。
从集合中获取最后‘n’个文档
有多种方法可以获取集合中的最后 n 个文档。
让我们通过以下步骤来看一下其中一种方法
以下示例显示了如何做到这一点。
假设我们有相同的员工集合,其字段名称为“Employeeid”和“EmployeeName”。
我们还假设我们的收藏中有以下文件:
员工ID | 员工姓名 |
---|---|
22 | 纽马丁 |
2 | Mohan |
3 | Joe |
4 | 莫汉 |
100 | Guru99 |
6 | 古朗 |
7 | 古鲁99号 |
db.Employee.find().sort({_id:-1}).limit(2).forEach(printjson)
代码说明:
1)查询文档时,使用sort函数根据集合中的_id字段值对记录进行反向排序。 -1基本上表示按相反顺序或降序对文档进行排序,以便最后一个文档成为第一个显示的文档。
2) 然后使用 limit 子句来显示所需的记录数。这里我们设置了 limit 子句 (2),因此它将获取最后两个文档。
如果命令执行成功,将显示以下输出:
输出:
输出清楚地表明,显示了集合中的最后两个文档。因此,我们清楚地表明,要获取集合中的最后“n”个文档,我们可以先按降序对文档进行排序,然后使用 limit 子句返回所需的“n”个文档。
备注:如果搜索的字符串长度超过 38,000 个字符,则不会显示正确的结果。
结语
- 模式匹配可以通过 $regex 运算符实现。此运算符可用于在集合中查找某些字符串。
- ^ 和 $ 符号可用于精确文本搜索,其中 ^ 用于确保字符串以某个字符开头,而 $ 用于确保字符串以某个字符结尾。
- 'i' 与 $regex 运算符一起可用于指定不区分大小写,以便无论字符串是小写还是大写都可以进行搜索。
- 分隔符 // 也可以用于模式匹配。
- 使用 sort 和 limit 函数的组合来返回集合中的最后 n 个文档。sort 函数可用于按降序返回文档,之后可以使用 limit 子句来限制返回的文档数量。