3分钟把握MongoDB中的regex几种用法51CTO博客 - 众发娱乐

3分钟把握MongoDB中的regex几种用法51CTO博客

2019年03月06日10时38分17秒 | 作者: 飞珍 | 标签: 运用,查询,用法 | 浏览: 419

选项意义运用要求
i大小写不灵敏
m

查询匹配中运用了锚,例如^(代表最初)和$(代表结束),以及匹配\n后的字符串


x

忽视一切空白字符

要求$regex与$option合用s答应点字符(.)匹配一切的字符,包括换行符。要求$regex与$option合用








实战

Part1:$in中的用法

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

{ name: { $in: [ /^acme/i, /^ack/ ] } }

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


Part2:隐式and用法

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

{ name: { $regex: /acme.*corp/i, $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: /acme.*corp/, $options: 'i', $nin: [ 'acmeblahcorp' ] } }
{ name: { $regex: 'acme.*corp', $options: 'i', $nin: [ 'acmeblahcorp' ] } }


Part3:x和s选项

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

{ name: { $regex: /acme.*corp/, $options: "si" } }
{ name: { $regex: 'acme.*corp', $options: "si" } }


Part4:索引的运用

关于区别大小写的正则表达式查询,假如字段存在索引,则MongoDB将正则表达式与索引中的值进行匹配,这比全表扫描更快。假如正则表达式是“前缀表达式”,那么可以优化查询速度,且查询成果都会以相同的字符串最初。

正则表达式也要契合“最左前缀准则”,例如,正则表达式/^abc.*/将经过仅匹配以abc最初的索引值来进行优化。


Warning:警告 

1.尽管/^a/,/^a.*/和/^a.*$/匹配等效字符串,但它们的功能是不一样的。假如有对应的索引,一切这些表达式就都运用索引;不过,/^a.*/和/^a.*$/较慢。 这是因为/^a/可以在匹配前缀后中止扫描。

2.不区别大小写的正则表达式查询一般不能运用索引,$regex无法运用不区别大小写的索引。


Part5:实例

一个产品的调集中,存了以下内容

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

假如想对该产品products调集履行一个查询,规模是sku列中的内容是789结束的:

db.products.find( { sku: { $regex: /789$/ } } )

结合MySQL了解的话,上述查询在MySQL中是这样的SQL:

SELECT * FROM products WHERE sku like "%789";

假如想查询sku是abc、ABC最初的,且匹配时疏忽大小写,可以运用i选项:

db.products.find( { sku: { $regex: /^ABC/i } } )、

查询成果为:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }


Part6:m的运用

想查询描绘中是包括S最初的,且要匹配/n后的S最初的,则需求加m选项

db.products.find( { description: { $regex: /^S/, $options: 'm' } } )

回来的成果是:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }

假如不加m选项的话,回来的成果是这样的:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

假如不运用^这类锚的话,那么会回来悉数成果:

db.products.find( { description: { $regex: /S/ } } )
{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }
{ "_id" : 101, "sku" : "abc789", "description" : "First line\nSecond line" }


Part7:s的运用

运用s选项来履行查询,则会让逗号. 匹配一切字符,包括换行符,下文查询了description列中m最初,且后边包括line字符串的成果:

db.products.find( { description: { $regex: /m.*line/, $options: 'si' } } )
{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }
{ "_id" : 103, "sku" : "xyz789", "description" : "Multiple\nline description" }

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

{ "_id" : 102, "sku" : "xyz456", "description" : "Many spaces before     line" }


Part8:x的运用

以下示例运用x选项疏忽空格和注释,用#表明注释,并以匹配形式中的\ n结束:

var pattern = "abc #category code\n123 #item number"
db.products.find( { sku: { $regex: pattern, $options: "x" } } )

查询的成果是:

{ "_id" : 100, "sku" : "abc123", "description" : "Single line description." }

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



——总结——

经过这几个事例,咱们可以了解到MongoDB中的regex用法,以及其可选参数$option每个选项的意义和用法。因为笔者的水平有限,编写时刻也很匆促,文中难免会呈现一些过错或许不精确的当地,不当之处恳请读者批评指正。喜爱笔者的文章,右上角点一波重视,谢谢~


33.png

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章