- A+
配景
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每个选项的寄义和用法。因为笔者的程度有限,编写光阴也很仓皇,文中不免会呈现一些差错或者禁绝确的处所,不妥之处恳请读者批驳指正。
好了,以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。