正则表达式是一种用单个字符串描述并匹配一组符合特定语法规则字符串的方式,常用于文本检索、字符串匹配与内容筛选。

很多编程语言都支持通过正则表达式进行字符串处理,因此它也是开发中常见的文本匹配工具。
在 MongoDB 中,可以使用 $regex 操作符来定义用于匹配字符串的正则表达式条件。
MongoDB 采用 PCRE(Perl Compatible Regular Expression)作为正则表达式语法规范。
与全文检索不同,使用 MongoDB 正则表达式查询时通常无需额外配置,适合进行简单灵活的模糊匹配。
下面以 posts 集合的文档结构为例,该文档包含文章正文内容和标签字段:
{
"post_text": "enjoy the mongodb articles on runoob",
"tags": [
"mongodb",
"runoob"
]
}
使用正则表达式
以下查询命令演示了如何使用正则表达式查找包含 runoob 字符串的文章内容:
>db.posts.find({post_text:{$regex:"runoob"}})
上述 MongoDB 正则查询也可以写成更简洁的形式:
>db.posts.find({post_text:/runoob/})
不区分大小写的正则表达式
如果搜索时需要忽略大小写,可以通过设置 $options 为 $i 来实现不区分大小写匹配。
下面的命令将查找所有不区分大小写的 runoob 字符串:
>db.posts.find({post_text:{$regex:"runoob",$options:"$i"}})
查询结果会返回集合中所有包含 runoob 的记录,无论字母大小写如何:
{
"_id" : ObjectId("53493d37d852429c10000004"),
"post_text" : "hey! this is my post on runoob",
"tags" : [ "runoob" ]
}
数组元素使用正则表达式
数组类型字段同样可以使用正则表达式进行匹配,在标签检索、分类筛选等场景中非常实用。例如,若要查询 tags 数组中包含以 run 开头标签的数据,如 ru、run、runoob 等,就可以使用下面的查询语句:
>db.posts.find({tags:{$regex:"run"}})
优化正则表达式查询
- 如果文档字段已经建立索引,那么优先利用索引进行查询,通常会比直接使用正则表达式扫描全部数据的速度更快。
- 如果正则表达式属于前缀匹配,那么查询效率通常更高。也就是说,所有匹配结果都会以指定前缀开头。例如: 如果正则表达式为 ^tut ,则查询语句会查找所有以 tut 开头的字符串。
使用正则表达式时,还需要注意以下两点:
在正则表达式中如果需要使用变量,一个常见问题是:字符串拼接完成后,不能直接作为表达式使用,而要借助 eval 先将组合后的字符串转换为正则对象。否则程序可能不会报错,但最终匹配结果为空,导致查询失效。示例如下:
var name=eval("/" + 变量值key +"/i");
下面是一个模糊查询 title 关键词并忽略大小写的示例:
title:eval("/"+title+"/i") // 等同于 title:{$regex:title,$Option:"$i"} 