MongoDB 正则表达式

  • 正则表达式

    在所有语言中,经常使用正则表达式来搜索任何字符串中的模式或单词。MongoDB还提供了使用$regex运算符进行字符串模式匹配的正则表达式功能。MongoDB使用PCRE(Perl兼容正则表达式)作为正则表达式语言。 与全文搜索不同,我们不需要进行任何配置或命令即可使用正则表达式。假设我们已经在名为posts的集合中插入了一个文档,如下所示-
    
    > db.posts.insert(
    {
       "post_text": "enjoy the mongodb articles on jc2182",
       "tags": [
          "mongodb",
          "jc2182"
       ]
    }
    WriteResult({ "nInserted" : 1 })
    
  • 使用正则表达式

    以下正则表达式查询搜索其中包含字符串 jc2182 的所有帖子-
    
    db.posts.find({post_text:{$regex:"jc2182"}}).pretty()
    {
      "_id" : ObjectId("5f4f366d5406e4349a0cd253"),
      "post_text" : "enjoy the mongodb articles on jc2182",
      "tags" : [
        "mongodb",
        "jc2182"
      ]
    }
    
    相同的查询也可以写成-
    
    db.posts.find({post_text:/jc2182/}).pretty()
    {
      "_id" : ObjectId("5f4f366d5406e4349a0cd253"),
      "post_text" : "enjoy the mongodb articles on jc2182",
      "tags" : [
        "mongodb",
        "jc2182"
      ]
    }
    
  • 使用不区分大小写的正则表达式

    为了使搜索不区分大小写,我们使用$options参数,其值为$i。以下命令将查找具有词 jc2182 的字符串,而不考虑大小写或小写字母-
    
    > db.posts.find({post_text:{$regex:"JC2182",$options:"$i"}}).pretty()
    {
      "_id" : ObjectId("5f4f366d5406e4349a0cd253"),
      "post_text" : "enjoy the mongodb articles on jc2182",
      "tags" : [
        "mongodb",
        "jc2182"
      ]
    }
    
    我们的搜索模式写的是大写字母,文本中是小写的也能匹配出来。
  • 对数组元素使用正则表达式

    我们也可以在数组字段上使用正则表达式的概念。当我们实现标签的功能时,这尤其重要。因此,如果您要搜索所有带有标签的单词,这些单词均以单词tutorial( tutorialjc2182或tutorialphp)开头,则可以使用以下代码-
    
    db.posts.find({tags:{$regex:"tutorial"}}).pretty()
    {
      "_id" : ObjectId("5f4f366d5406e4349a0cd254"),
      "post_text" : "writing tutorials on mongodb",
      "tags" : [
        "mongodb",
        "tutorials"
      ]
    }
    
  • 优化正则表达式查询

    • 如果文档字段已建立索引,则查询将使用索引值来匹配正则表达式。与正则表达式扫描整个集合相比,这使搜索非常快。
    • 如果正则表达式是前缀表达式,则所有匹配项均应以某个字符串字符开头。例如,如果regex表达式为^tut,则查询只需要搜索以tut开头的字符串。