模糊查询简介
MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能。模糊查询可以使用$regex操作符或直接使用正则表达式对象。
MongoDB使用$regex操作符来设置匹配字符串的正则表达式,使用PCRE(Pert Compatible Regular Expression)作为正则表达式语言。
regex操作符
{:{ r e g e x : / p a t t e r n / , regex:/pattern/, regex:/pattern/,options:’’}}
{:{ r e g e x : ’ p a t t e r n ’, regex:’pattern’, regex:’pattern’,options:’’}}
{:{$regex:/pattern/}}
正则表达式对象
{: /pattern/}$regex与正则表达式对象的区别:
在KaTeX parse error: Expected '}', got 'EOF' at end of input: …达式对象,例如:{name:{in:[/^joe/i, /^jack/}}
在使用隐式的 a n d 操作符中,只能使用 and操作符中,只能使用 and操作符中,只能使用regex,例如:{name:{$regex:/^jo/i, $nin:[‘john’]}}
当option选项中包含X或S选项时,只能使用KaTeX parse error: Expected '}', got 'EOF' at end of input: …egex,例如:{name:{regex:/m.*line/,$options:“si”}}
$regex操作符的使用
$regex操作符中的option选项可以改变正则匹配的默认行为,它包括i, m, x以及S四个选项,其含义如下
i 忽略大小写,{{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。
m 多行匹配模式,{{ r e g e x / p a t t e r n / , regex/pattern/, regex/pattern/,options:‘m’},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。
x 忽略非转义的空白字符,{:{ r e g e x : / p a t t e r n / , regex:/pattern/, regex:/pattern/,options:‘m’},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。
s 单行匹配模式{:{ r e g e x : / p a t t e r n / , regex:/pattern/, regex:/pattern/,options:‘s’},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。
使用$regex操作符时,需要注意下面几个问题:
i,m,x,s可以组合使用,例如:{name:{ r e g e x : / j ∗ k / , regex:/j*k/, regex:/j∗k/,options:“si”}}
在设置索弓}的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}
上面介绍的元字符可能就会让我们在查询的时候出现一些问题,比如有时候想要查询出所有带价格的模糊商品的时候用了.元字符进行模糊搜索,这时候会查询出来全部的数据;
这个时候就需要对模糊查询的条件进行一些操作,转义一下:
// 转义
async escape(name) {
let str = '';
try {
switch (name) {
case '.':
case '^':
case '$':
str = `\\${name}`;
break;
default:
str = name;
break;
}
return str;
} catch (error) {
return error;
}
}