Navicat 博客

2019 年 4 月 1 日,由 Robert Gravelle 撰写

正则表达式(regex)提供了一种将字符串与模式匹配的方法,以便搜索变得“模糊”而不是精确。MongoDB 内置了一个 regex 引擎,因此即使你只是大概知道正在寻找的确切字段值,你也可以找到文档。在今天的文章中,我们将学习如何使用 Navicat for MongoDB 在 MongoDB 运用正则表达式。

基本语法

MongoDB提供了 regex 运算符,用于搜索集合中的字符串。以下例子显示了如何在 Sakila 示例数据库完成搜索:

假设我们想要找到名为“DAN”、“DANNY”、“DANIEL”等演员的电影。这是要运行的语句:

db.film_list.find({actors: {$regex: "DAN" }})

成功运行命令后,将显示以下输出:

我们可以移除“$ regex:”限定符并将搜索字符串括在正斜杠(/)而不是引号中来简化语句,因为正斜杠表示 regex:

db.film_list.find({ actors: /DAN/ })

使用多个搜索字符串进行搜索

我们可以包含多个搜索字符串以匹配各种组合。假设我们想通过匹配“Carrie Moss”或“moss carrie-anne”找到 Carrie-Anne Moss 的电影。这是要运行的语句:

db.film_list.find(
   { actors: { $elemMatch: { actors: /Moss/i, actors: /carrie-anne/i } } }
);

$elemMatch 将返回数组元素与两个准则匹配的记录。相比之下,在没有 $elemMatch 的情况下使用普通的 $and(这是准准则列表的默认值)将返回“Carrie-Anne Moss”,还有“Sandra Moss”和“Carrie-Anne Fisher”的电影。这将是我们想要检索的信息的超集。还有一项要注意的是“i”标志。它使正则表达式不区分大小写。这对用户输入的搜索很有用,因为我们不能依赖用户使用混合大小写。

options 参数

我们还可以使用 options 参数为我们的正则表达式提供附加指令。

  • i:不区分大小写以匹配大写和小写。
  • m:对于含有定位的模式(即 ^ 表示开头,$ 表示结尾),在每行的开头或结尾处匹配具有多行值的字符串。如果没有此选项,这些定位将在字符串的开头或结尾处匹配。
  • x:扩展功能可忽略 $regex 模式中的所有空格字符,除非字符转义或包含在字符类中。与其他标志不同,这个标志需要带有 $options 语法的 $regex。
  • s:允许句点(.)字符匹配包括换行符在内的所有字符。

总结

$regex 运算符在 MongoDB 中提供了一种简单的模式匹配方法。为获得最佳结果,请确保将要搜索的文档字段编入索引。这样,查询将使用索引值来匹配正则表达式。与扫描整个集合的正则表达式相比,这使搜索速度変得更快。

如果你想了解有关 Navicat for MongoDB 的更多信息,请访问产品页面产品页面。如果你使用多种数据库类型,可选择支持 MongoDB 的 Navicat Premium 12.1

Navicat 文章
频道条目
分享
文章归档