MongoDB – 正则表达式
MongoDB – 正则表达式
所有语言都经常使用正则表达式来搜索任何字符串中的模式或单词。MongoDB 还提供了使用$regex运算符进行字符串模式匹配的正则表达式功能。MongoDB 使用 PCRE(Perl Compatible Regular Expression)作为正则表达式语言。
与文本搜索不同,我们不需要做任何配置或命令来使用正则表达式。
假设我们在名为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"}})
此查询返回的结果之一是以下文档,其中包含不同情况下的tutorialspoint一词–
{ "_id" : ObjectId("53493d37d852429c10000004"), "post_text" : "hey! this is my post on TutorialsPoint", "tags" : [ "tutorialspoint" ] }
对数组元素使用正则表达式
我们也可以在数组字段上使用正则表达式的概念。这在我们实现标签的功能时尤为重要。因此,如果您想搜索所有带有以教程一词开头的标签的帖子(教程或教程或教程点或教程php),您可以使用以下代码 –
>db.posts.find({tags:{$regex:"tutorial"}})
优化正则表达式查询
-
如果文档字段被索引,则查询将使用索引值来匹配正则表达式。与扫描整个集合的正则表达式相比,这使得搜索速度非常快。
-
如果正则表达式是前缀表达式,则所有匹配项均以特定字符串字符开头。例如,如果正则表达式是^tut,那么查询必须只搜索那些以tut开头的字符串。