Mongodb 简明教程

MongoDB - Regular Expression

正则表达式经常用于各种语言中,以在任意字符串中搜索某个模式或单词。MongoDB 还提供正则表达式功能,用于使用 $regex 运算符进行字符串模式匹配。MongoDB 将 PCRE(Perl 兼容正则表达式)用作正则表达式语言。

不同于文本搜索,我们无需执行任何配置或命令即可使用正则表达式。

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

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

Using regex Expression

以下正则表达式查询搜索其中包含字符串 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/})

Using regex Expression with Case Insensitive

要使搜索不区分大小写,我们可以使用值 $i$options 参数。以下命令无论大小写都会查找包含单词 tutorialspoint 的字符串:

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

此查询返回的结果之一是包含单词 tutorialspoint (大小写不一致)的以下文档:

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

Using regex for Array Elements

我们还可以在数组字段上使用正则表达式概念。当我们实现标签功能时,这尤其重要。因此,如果要搜索所有标签以单词教程(教程、教程或 tutorialpoint 或 tutorialphp)开头的帖子,可以使用以下代码:

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

Optimizing Regular Expression Queries

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

  2. 如果正则表达式是 prefix expression ,则所有匹配项都应以某个字符串字符开头。例如,如果正则表达式是 ^tut ,则查询必须仅搜索以 tut 开头的字符串。