正则表达式是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
许多程序设计语言都支持利用正则表达式进行字符串操作。
MongoDB 使用 $regex 操作符来设置匹配字符串的正则表达式。
MongoDB使用PCRE (Perl Compatible Regular Expression) 作为正则表达式语言。
不同于全文检索,我们使用正则表达式不需要做任何配置。
使用正则表达式
- 演示数据:
/* 1 */
{
"_id" : ObjectId("59efd2ed2931dbc1733a94e0"),
"address" : {
"province" : "HeNan",
"city" : "ZhengZhou",
"pincode" : "123"
},
"tags" : [
"music",
"cricket",
"blogs"
],
"name" : "fly"
}
/* 2 */
{
"_id" : ObjectId("59efd2ed2931dbc1733a94e1"),
"address" : {
"province" : "HeBei",
"city" : "HanDan",
"pincode" : "234"
},
"tags" : [
"music",
"basket",
"blogs"
],
"name" : "chen"
}
/* 3 */
{
"_id" : ObjectId("59efd2ed2931dbc1733a94e2"),
"address" : {
"province" : "ChongQing",
"city" : "ChongQing",
"pincode" : "456"
},
"tags" : [
"music",
"writing",
"running"
],
"name" : "wang"
}
- 查找name包含 f字符串的用户:
db.user.find({name:{$regex:"f"}})
- 以上查询也可以写为:
db.user.find({name:/f/})
- 查找name包含 f字符串的用户,忽略大小写:
db.user.find({name:{$regex:"F", $options: 'i'}})
或者
db.user.find({name:/F/i})
正则可选项
- mongodb和其他语言标准正则稍有不同,有自己的标准。
$options的可选值
i 忽略大小写;
m 多行查找,如果内容里面不存在换行符号(例如 \n)或者构造上没有(start/end),该选项没有任何效果;
x 【忽视空吧字符串】空白字符除了被转义的或在字符类中的以外完全被忽略,在未转义的字符类之外的 # 以及下一个换行符之间的所有字符,包括两头,也都被忽略;
s 圆点元字符(.)匹配所有的字符,包括换行符
数组元素使用正则表达式
- 我们还可以在数组字段中使用正则表达式来查找内容。
db.user.find({tags:{$regex:"basket"}})
优化正则表达式查询
如果你的文档中字段设置了索引,那么使用索引相比于正则表达式匹配查找所有的数据查询速度更快。
如果正则表达式是前缀表达式,所有匹配的数据将以指定的前缀字符串为开始。例如: 如果正则表达式为 ^F ,查询语句将查找以 F为开头的字符串。
db.user.find({name:{$regex:"^F", $options: 'i'}})
正则表达式中使用变量
- 正则表达式中使用变量。一定要使用eval将组合的字符串进行转换,不能直接将字符串拼接后传入给表达式。否则没有报错信息,只是结果为空!实例如下:
var name=eval("/" + 变量值key +"/i");
- 以下是模糊查询包含f关键词, 且不区分大小写:
name:eval("/"+f+"/i") // 等同于 title:{$regex:f,$Option:"$i"}
使用正则表达式的更新操作:
db.user.update( { name:/F/i}, { $set: { 'site':'http://blog.csdn.net/fly910905' } } , false, true)
- 参数有顺序,false是upsert,如果没有就插入新的。true就是multi多条记录更新,所有匹配到的结果。或者直接指定{ multi: true }:
db.user.update( { name:/Q/i}, { $set: { 'site':'http://blog.csdn.net/fly910905' } } , { multi: true })
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:用于设置查询条件的对象(必填)({},表示更新所有)
objNew:用于设置更新内容的对象(必填)
upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1[true为插入,默认是false,不插入]
multi:如果有多个符合条件的记录,是否全部更新,取值为0或1[mongodb 默认是false,只更新找到的第一条记录]
注意:默认情况下,只会更新第一个符合条件的记录
一般情况下后两个参数分别为0,1 ,即:
db.collection.update(criteria,objNew,0,1)
使用正则表达式的替换操作:
db.user.find().forEach(
function(u) {
u.site= u.site.replace(/\./, "-");
db.user.save(u);
}
);
参考来源: http://www.runoob.com/mongodb/mongodb-regular-expression.html
参考来源: http://www.jb51.net/article/73958.htm