通过3分钟快速掌握MongoDB中regex的几种用法

  • A+
所属分类:MongoDB

配景

Part1:写在最前

使用MySQL或其他关系型数据库的同伙们都知道,使用隐约查询的用法相似于:

本文中先容的MongoDB中的regex便是实现相似功效的,regex为能使你在查询中使用正则表达式。本文会用简单的实例带您相识MongoDB中regex的用法~

Part2:用法

使用$regex时,有以下几种用法:

option参数的寄义:

选项 寄义 使用要求

i
年夜小写不敏感

m

查询匹配中使用了锚,例如^(代表开首)和$(代表结尾),以及匹配\n后的字符串

x

轻忽所有空缺字符

要求$regex与$option合用

s
容许点字符(.)匹配所有的字符,包含换行符。
要求$regex与$option合用

实战

Part1:$in中的用法

要在$in查询中包括正则表达式,只能使用JavaScript正则表达式工具(即/ pattern /)。 例如:

Warning:警告 $in中不克不及使用$ regex运算符表达式。

Part2:隐式and用法

要在逗号分隔的查询前提中包括正则表达式,请使用$ regex运算符。 例如:

Part3:x和s选项

要使用x选项或s选项,要求$regex与$option合用。 例如,要指定i和s选项,必需使用$ options来执行以下操作:

Part4:索引的使用

对付区分年夜小写的正则表达式查询,假如字段存在索引,则MongoDB将正则表达式与索引中的值进行匹配,这比全表扫描更快。假如正则表达式是“前缀表达式”,那么可以优化查询速率,且查询成果都邑以雷同的字符串开首。

正则表达式也要相符“最左前缀原则”,例如,正则表达式/^abc.*/将经由过程仅匹配以abc开首的索引值来进行优化。

Warning:警告

1.固然/^a/,/^a.*/和/^a.*$/匹配等效字符串,但它们的机能是纷歧样的。假如有对应的索引,所有这些表达式就都使用索引;不外,/^a.*/和/^a.*$/较慢。 这是由于/^a/可以在匹配前缀后结束扫描。

2.不区分年夜小写的正则表达式查询通常不克不及使用索引,$regex无法使用不区分年夜小写的索引。

Part5:实例

一个商品的聚拢中,存了以下内容

假如想对该商品products聚拢执行一个查询,规模是sku列中的内容是789结尾的:

联合MySQL懂得的话,上述查询在MySQL中是如许的SQL:

假如想查询sku是abc、ABC开首的,且匹配时疏忽年夜小写,可以使用i选项:

查询成果为:

Part6:m的使用

想查询描写中是包括S开首的,且要匹配/n后的S开首的,则必要加m选项

返回的成果是:

假如不加m选项的话,返回的成果是如许的:

假如不使用^这类锚的话,那么会返回全体成果:

Part7:s的使用

使用s选项来执行查询,则会让逗号. 匹配所有字符,包含换行符,下文查询了description列中m开首,且后面包括line字符串的成果:

假如不包括s,则会返回:

Part8:x的使用

以下示例使用x选项疏忽空格和注释,用#表现注释,并以匹配模式中的\ n结尾:

查询的成果是:

可以看出,其疏忽了abc与#category的空格以及#category与code的空格,现实执行的查询是sku是abc123的成果。

总结

经由过程这几个案例,我们可以或许相识到MongoDB中的regex用法,以及其可选参数$option每个选项的寄义和用法。因为笔者的程度有限,编写光阴也很仓皇,文中不免会呈现一些差错或者禁绝确的处所,不妥之处恳请读者批驳指正。

好了,以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: