MongoDB教程:正则表达式($regex)
正则表达式用于模式匹配,基本上是用于文档中的发现字符串。
有时,在检索集合中的文档时,我们可能不知道要搜索的确切字段值。因此,可以使用正则表达式来基于模式匹配搜索值来帮助检索数据。
本章我们将要学习如下内容——
- 使用$ regex运算符进行模式匹配
- 与$ options进行模式匹配
- 没有regex运算符的模式匹配
- 从集合中获取最后一个’n’个文档
使用$ regex运算符进行模式匹配
MongoDB中的regex运算符用于在集合中搜索特定的字符串。以下例子显示了如何完成此操作。
假设我们有相同的Employee集合,其字段名称为“ Employeeid”和“ EmployeeName”。我们还假设我们的收藏集中有以下文件。
Employee id | Employee Name |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
在下面的代码中,我们使用了正则表达式运算符来指定搜索条件。
db.Employee.find({EmployeeName : {$regex: “Gu” }}).forEach(printjson)
代码解释:
- 在这里,我们要查找所有带有字符“ Gu”的EmployeeName。因此,我们指定$ regex运算符来定义“ Gu”的搜索条件
- printjson用于打印查询以更好的方式返回的每个文档。
命令执行成功,将显示以下结果:
可以看出,这里返回了其中Employee Name包含“ Gu”字符的那些文档。
如果假设我们的集合包含以下文档以及其他文档,其中包含名为“ Guru999”的Employee Name。如果将搜索条件输入为“ Guru99”,它还将返回包含“ Guru999”的文档。但是,假设我们不希望这样做,只想返回带有“ Guru99”的文档。然后,我们可以通过精确的模式匹配来做到这一点。为了进行精确的模式匹配,我们将使用 ^ 和 $ 字符。我们将在字符串的开头添加 ^ 字符,并在字符串的末尾添加$。
Employee id | Employee Name |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
8 | Guru999 |
如何完成此操作。
db.Employee.find({EmployeeName : {$regex: “^Guru99$”}}).forEach(printjson)
代码解释:
- 在搜索条件中,我们使用^和 字 符 。 用 于 确 保 字 符 串 以 特 定 字 符 开 头 , 而 字符。^用于确保字符串以特定字符开头,而 字符。用于确保字符串以特定字符开头,而用于确保字符串以特定字符结尾。因此,当代码执行时,它将仅获取名称为“ Guru99”的字符串。
- printjson用于打印查询以更好的方式返回的每个文档。
命令执行成功,结果如下:
从结果中,我们可以清楚地看到已提取字符串“ Guru99”。
与$ options进行模式匹配
使用正则表达式运算符时,还可以使用**$ options关键字提供其他选项。假设我们想查找所有在Employee Name中带有“ Gu”的文档,而不管它是区分大小写还是不区分大小写。如果需要这样的结果,那么我们需要使用不区分大小写参数的$ options**。
以下示例显示了如何完成此操作。
假设我们有相同的Employee集合,其字段名称为“ Employeeid”和“ EmployeeName”。
假设我们的集合有以下文档。
Employee id | Employee Name |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
现在,我们运行与上一个相同的查询,我们将永远不会在结果中看到带有“ GURU99”的文档。为了确保将其包含在结果集中,我们需要添加$ options“ I”参数。
db.Employee.find({EmployeeName:{$regex: “Gu”,$options:’i’}}).forEach(printjson)
代码说明:
- 带
“ i ”
参数(表示不区分大小写)的$ options指定无论我们发现字母“ Gu”是小写还是大写,我们都希望执行搜索。
命令执行成功,结果如下:
结果表明,即使一个文档具有大写字母“ Gu”,该文档仍会显示在结果集中。
没有regex运算符的模式匹配
不用regex运算符也可以进行模式匹配。以下示例显示了如何完成此操作。
db.Employee.find({EmployeeName: /Gu/’}).forEach(printjson)
代码说明:
- “ //”选项基本上意味着在这些定界符中指定搜索条件。因此,我们指定/ Gu /再次查找其EmployeeName中具有“ Gu”的文档。
命令执行成功,结果如下:
结果显示,返回了其中雇员姓名包含“ Gu”字符的那些文档。
从集合中获取最后n个文档
有多种方法可以获取集合中的最后n个文档。让我们看看以下步骤中的一种方法。
假设我们有相同的Employee集合,其字段名称为“ Employeeid”和“ EmployeeName”。
我们还假设我们的集合中有如下文档:
Employee id | Employee Name |
---|---|
22 | NewMartin |
2 | Mohan |
3 | Joe |
4 | MohanR |
100 | Guru99 |
6 | Gurang |
7 | GURU99 |
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子句来限制要返回的文档数。
links:
https://www.guru99.com/regular-expressions-mongodb.html
https://mongoing.com/archives/docs/mongodb%e5%88%9d%e5%ad%a6%e8%80%85%e6%95%99%e7%a8%8b/mongodb%e6%ad%a3%e5%88%99%e8%a1%a8%e8%be%be%e5%bc%8f%ef%bc%88regex%ef%bc%89
叶叶知秋: 太牛了找了一晚上是ip转发没有打开
北风之神c: 总结的很全面,写得赞,博主用心了。 celery对目录层级文件名称格式要求太高,只适合规划新的项目,对不规则文件夹套用难度高。 所以新手使用celery很仔细的建立文件夹名字、文件夹层级、python文件名字。 所以网上的celery博客教程虽然很多,但是并不能学会使用,因为要运行起来需要以下6个方面都掌握好,博客文字很难表达清楚或者没有写全面以下6个方面。 celery消费任务不执行或者报错NotRegistered,与很多方面有关系,如果要别人排错,至少要发以下6方面的截图,因为与一下6点关系很大。 1)整个项目目录结构, 2)@task入参 ,3)celery的配置,4)celery的配置 include ,5)cmd命令行启动参数 --queues= 的值,6)用户在启动cmd命令行时候,用户所在的文件夹。 在不规范的文件夹路径下,使用celery难度很高,一般教程都没教。 [项目文件夹目录格式不规范下的celery使用演示](https://github.com/ydf0509/celery_demo) 。 此国产分布式函数调度框架 funboost python万能通用函数加速器 https://funboost.readthedocs.io/zh-cn/latest/articles/c1.html , 从用法调用难度,用户所需代码量,超高并发性能,qps控频精确程度,支持的中间件类型,任务控制方式,稳定程度等20个方面全方位超过celery。发布性能提高1000%,消费性能提高2000%。 python万能分布式函数调度框架funboost支持python所有类型的并发模式和一切知名消息队列中间件,python函数加速器,只需要一行代码调度任意函数,框架包罗万象,万能编程功能宝典,一统编程思维,与业务不绑定,适用范围广。 pip install funboost
奎木狼2023: 大写 -P是端口号 小写 -p是保留原来的属性,但对软链接不起作用,软链接还是会复制原文件
码踏云端: 一个字:好!
CSDN-Ada助手: MySQL入门 技能树或许可以帮到你:https://edu.csdn.net/skill/mysql?utm_source=AI_act_mysql