MongoDB学习(二)基础操作查询

查询操作

mongo支持关系运算,逻辑运算,数组运算,正则运算

语法db.集合名称.find({若干条件}[,{显示字段}])显示的字段设置成1,不显示的设置成0;db.集合名称.find()就相当于select all

pretty()跟在查询后面,实现的是一个格式化查询结果的函数。

db.dept.findOne()查看单独的一个信息

在mongodb里面支持关系查询操作:大于($gt),小于($lt),大于等于($gte),小于等于($lte),不等于($ne),等于(key:value)

相等查询

大于查询

条件需要嵌套查询db.students.find("age",{"$gte":20});

不等于查询

其余的操作差不多。

逻辑运算三种类型:与($and)、或($or)、非($not)、($nor)

与($and):可用两个条件中的逗号来当做简写,这句话表示查询年龄大于18小于30的数据

或($or),条件要用[]数据来表示[{},{}...],($nor)取或的求反

求模运算

{"$mod",[除数,余数]}

查询age%20 = 0 的数据

范围查询($in)和($nin)

($in)在什么范围

($nin)不在什么范围

数组操作

运算符$all、$size、$slice、$elemMatch

$all:

查询选修包含英语和语文的人员 {"$all":[内容一,内容二]}

$all可以使用在数组上面,也可以使用在单个数据上面

$size:

查询选修的课程为两门的数据{"course":{"$size":2}}

也可以根据数组的角标查询数据,数组的角标是以0开始。

查询选修的第二门课程是英文的数据。{"course.1":"英文"}

$slice:

获取数组中的截断的数据。

返回年龄为20岁,选修课程显示前两门。{"age":20,{"course":{"$slice":2}}}

如果写成{"$slice":[1,2]}则1表示跳过一个课程,显示后面的2个课程。

原始的数据

查询的数据

$elemMatch:嵌套查询

 db.students3.find({"$and":[{"age":{"$gt":18}},{"parents":{"$elemMatch":{"job":"程序员"}}}]}).pretty();

查询年龄大于18岁,父母中职业有程序员的数据集合

判断字段是否存在$exists

db.students.find({"sex":{"$exists":true}}).pretty();

条件查询$where

 db.students.find({"$where":"this.age>20"}).pretty();

简写: db.students.find("this.age>20").pretty();

相当于 db.students.find(function(){

        return this.age>20;

}).pretty();

这种where查询是将mongodb中的bson转换成json,这样子便使用不了索引机制了。

查询年龄大于20岁的数据集合

正则表达式

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

数据排序

$sort  $natural

升序(1)、降序(-1)

特别注意natural是根据保存的先后顺序进行排序

db.students.find().sort({"score":-1}).pretty();

以成绩的降序为例

db.students.find().sort({"$natural":-1}).pretty();

以保存的顺序的倒序为例子

数据的分页显示

skip(n):表示跨过多少条数据行;

limit(n):取出多少条数据的个数限制;

db.students.find().sort({"$natural":-1}).pretty();

查询2条数据

版权声明: 原创文章,如需转载,请注明出处。 https://blog.csdn.net/lwx356481/article/details/82219067

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值