模糊查詢簡介
MongoDB查詢條件可以使用正則表達式,從而實現模糊查詢的功能。模糊查詢可以使用$regex操作符或直接使用正則表達式對象。
MySQL | MongoDB |
select * from student where name like ’%joe%’ | db.student.find({name:{$regex:/joe/}}) |
select * from student where name regexp ’joe’ | db.student.find({name:/joe/}) |
$regex操作符的介紹
MongoDB使用$regex操作符來設置匹配字符串的正則表達式,使用PCRE(Pert Compatible Regular Expression)作為正則表達式語言。
- regex操作符
- {<field>:{$regex:/pattern/,$options:’<options>’}}
- {<field>:{$regex:’pattern’,$options:’<options>’}}
- {<field>:{$regex:/pattern/<options>}}
- 正則表達式對象
- {<field>: /pattern/<options>}$regex與正則表達式對象的區別:
在$in操作符中只能使用正則表達式對象,例如:{name:{$in:[/^joe/i,/^jack/}}
在使用隱式的$and操作符中,只能使用$regex,例如:{name:{$regex:/^jo/i, $nin:['john']}}
當option選項中包含X或S選項時,只能使用$regex,例如:{name:{$regex:/m.*line/,$options:"si"}}
$regex操作符的使用
$regex操作符中的option選項可以改變正則匹配的默認行為,它包括i, m, x以及S四個選項,其含義如下
- i 忽略大小寫,{<field>{$regex/pattern/i}},設置i選項后,模式中的字母會進行大小寫不敏感匹配。
- m 多行匹配模式,{<field>{$regex/pattern/,$options:'m'},m選項會更改^和$元字符的默認行為,分別使用與行的開頭和結尾匹配,而不是與輸入字符串的開頭和結尾匹配。
- x 忽略非轉義的空白字符,{<field>:{$regex:/pattern/,$options:'m'},設置x選項后,正則表達式中的非轉義的空白字符將被忽略,同時井號(#)被解釋為注釋的開頭注,只能顯式位於option選項中。
- s 單行匹配模式{<field>:{$regex:/pattern/,$options:'s'},設置s選項后,會改變模式中的點號(.)元字符的默認行為,它會匹配所有字符,包括換行符(\n),只能顯式位於option選項中。
使用$regex操作符時,需要注意下面幾個問題:
-
- i,m,x,s可以組合使用,例如:{name:{$regex:/j*k/,$options:"si"}}
- 在設置索弓}的字段上進行正則匹配可以提高查詢速度,而且當正則表達式使用的是前綴表達式時,查詢速度會進一步提高,例如:{name:{$regex: /^joe/}