NoSQL学习笔记(六)模糊查询,正则表达式


模糊查询/正则表达式

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
    }
)

技术选型:

  1. in操作符中,只能使用正则表达式对象,如:

    db.students.find(
     {
         stuname:{
             $in:[
                 /zz/i,/x/
             ]
         }
     }
    )

    在这种情况下,不能用$regex

  2. 在使用隐式的$and操作符中,只能使用$regex,不能使用正则表达式对象。如:

    db.students.find(
     {
         stuname:{
             $regex:/z/i,
             $nin:['zz']
         }
     }
    )

    此时有两个条件:①开头是jo;②不能是john。此时只能用$regex

  3. $options选择中包含xs选择时,只能用$regex
  4. $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'
    }
)

注意:

  1. 下标从0开始,books.1表示第二本书
  2. 左边必须用引号引起来。

$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本书
        }
    }
)

声明:奋斗小刘|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - NoSQL学习笔记(六)模糊查询,正则表达式


Make Everyday Count