模糊查询/正则表达式
MongoDB使用正则表达式实现模糊查询。
常用情况:
- 对用户名和密码位数以及开头结尾的判断要求的时候
- 判断邮箱地址是否合法
- 是否含有特殊字符或禁止使用字符等等
正则表达式对象
例:查询姓名中带zz的同学
db.students.find(
{
stuname:/zz/i
},
{
_id:0,
stuname:1
}
)
上例中:
/zz/
叫做正则表达式对象i
代表不区分大小写
regex查询器
eg:查询所有名字含有'zz'的学生姓名
对于选项i
(不区分大小写)有两种写法
法一:在$options
中声明
db.students.find(
{
stuname:{
$regex:'zz',
$options:'i'
}
},
{
stuname:1,
_id:0
}
)
法二:直接在$regex
中声明
db.students.find(
{
stuname:{
$regex:/zz/i
}
},
{
stuname:1
}
)
技术选型:
在
in
操作符中,只能使用正则表达式对象,如:db.students.find( { stuname:{ $in:[ /zz/i,/x/ ] } } )
在这种情况下,不能用
$regex
。在使用隐式的
$and
操作符中,只能使用$regex
,不能使用正则表达式对象。如:db.students.find( { stuname:{ $regex:/z/i, $nin:['zz'] } } )
此时有两个条件:①开头是jo;②不能是john。此时只能用
$regex
。- 当
$options
选择中包含x
或s
选择时,只能用$regex
。 $not
不能与$regor
同时使用。
要想表示“不包含某正则式”,只能使用正则表达式对象:
eg:查找不包含“zz”的姓名。db.students.find( { stuname:{ $not:/zz/ } }, { stuname:1, _id:0 } )
数组查询
$all
查询数组中含有某个/某些元素的文档
eg:查询books含有'html'和'hadoop'的同学的信息
db.students.find(
{
books:{
$all:['html','MONGODB']
}
}
);
查询第i个元素是某个值的文档
eg:查询第2本书是java的同学
db.students.find(
{
'books.1':'java'
}
)
注意:
- 下标从0开始,books.1表示第二本书
- 左边必须用引号引起来。
$size
:根据数组长度查询
eg:查询拥有4本书的同学的信息
db.students.find(
{
books:{
$size:4
}
}
)
注意:$size
不能与比较操作($gt
,$lt
)等同时使用。
$slice
切片取数组元素
eg:查询xm的第2到第4本书
db.students.find(
{
stuname:'xm'
},
{
books:{
$slice:[1,2] //起始索引从1开始,取3个元素(3不是指到索引为3!)
}
}
)
也可以只写一个数,表述最前面/后面的几个元素
$slice
取正数:前几个元素$slice
取负数:后几个元素
db.students.find(
{
stuname:'xm'
},
{
books:{
$slice:3 //最前面的3本书
}
}
)
db.students.find(
{
stuname:'xm'
},
{
books:{
$slice:-3 //最后面的3本书
}
}
)
Comments | NOTHING