MongoDB - 正则表达式


正则表达式在所有语言中都经常使用,以搜索任何字符串中的模式或单词。MongoDB 还提供使用$regex运算符进行字符串模式匹配的正则表达式功能。MongoDB 使用 PCRE(Perl 兼容正则表达式)作为正则表达式语言。

与文本搜索不同,我们不需要做任何配置或命令就可以使用正则表达式。

假设我们在名为posts的数据库中插入了一个文档,如下所示 -

> db.posts.insert(
{
   "post_text": "enjoy the mongodb articles on tutorialspoint",
   "tags": [
      "mongodb",
      "tutorialspoint"
   ]
}
WriteResult({ "nInserted" : 1 })

使用正则表达式

以下正则表达式查询搜索其中包含字符串tutorialspoint的所有帖子-

> db.posts.find({post_text:{$regex:"tutorialspoint"}}).pretty()
{
	"_id" : ObjectId("5dd7ce28f1dd4583e7103fe0"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
{
	"_id" : ObjectId("5dd7d111f1dd4583e7103fe2"),
	"post_text" : "enjoy the mongodb articles on tutorialspoint",
	"tags" : [
		"mongodb",
		"tutorialspoint"
	]
}
>

相同的查询也可以写成 -

>db.posts.find({post_text:/tutorialspoint/})

使用不区分大小写的正则表达式

为了使搜索不区分大小写,我们使用值为$i的$options参数。以下命令将查找具有单词tutorialspoint的字符串,无论大小写 -

>db.posts.find({post_text:{$regex:"tutorialspoint",$options:"$i"}})

此查询返回的结果之一是以下文档,其中在不SymPy况下包含单词tutorialspoint -

{
   "_id" : ObjectId("53493d37d852429c10000004"),
   "post_text" : "hey! this is my post on TutorialsPoint", 
   "tags" : [ "tutorialspoint" ]
} 
 

对数组元素使用正则表达式

我们还可以在数组字段上使用正则表达式的概念。这在我们实现标签的功能时尤其非常重要。因此,如果您想搜索所有具有以tutorial(tutorial或tutorials或tutorialpoint或tutorialphp)开头的标签的帖子,您可以使用以下代码 -

>db.posts.find({tags:{$regex:"tutorial"}})

优化正则表达式查询

  • 如果文档字段已建立索引,则查询将使用索引值来匹配正则表达式。与扫描整个集合的正则表达式相比,这使得搜索速度非常快。

  • 如果正则表达式是前缀表达式,则所有匹配都以某个字符串字符开头。例如,如果正则表达式为^tut,则查询必须仅搜索以tut开头的那些字符串。