第四章 查询

本章将详细介绍查询。主要会涵盖一下几个方面:

  • 使用find或findOne函数和查询文档对数据库执行查询。
  • 使用$条件查询返回查询、数据集包含查询、不等式查询、以及其他查询;
  • 查询将会返回一个数据库游标,游标只会在你需要时才将需要的文档批量返回;
  • 还有很多针对游标执行的元操作,包括忽略一定数量的结果。或者限定返回结果的数量,以及结果排序。

4.1 find简介

MongoDB中使用find来进行查询。查询就是返回集合中文档的子集。子集的返回从0个文档到整个集合。

空的查询文档会匹配集合的全部内容:

db.users.find()

以上会返回users的所有结果。

查询年龄为27的用户:

db.users.find({'age':27})

查询用户名为joe,年龄27的用户:

db.users.find({'username':'joe',{'age':27}})

4.1.1 执行需要返回的键

有时并不需要将文档的所有键/值都返回,这种情况,可以通过find的第二个参数来指定想要的键:

db.users.find({},{'username':1,'email':1})

!这个参数后面的1暂未指定意思,等待实际操作。

如果要剔除不需要的键:

db.users.find({},{'age':0})

4.1.2 限制

查询使用上有些限制。传递给数据库的查询文档的值必须是常量。也就是不能引用文档中其他键的值。

4.2 查询条件

4.2.1 查询条件

"$lt"、"$lte"、"$gt"、"$gte"分别对应<、<=、>、>=

例如查询年龄大于18 小于30的结果:

db.users.find({'age':{'$gte':18,"$lte":30}})

查询时间大于2017年的:

start_time = new Date('01/01/2017')
db.users.find({'register_time':{'$lt':start_time}})

"$ne"符号为不相等,查询年龄不为18的用户:

db.users.find({'age':{"$ne":18}})

4.2.2 or查询 in查询

//查询年龄为18,19的用户
db.users.find({'age':{'$in':[18,19]}})
//查询年龄不为18,19的用户
db.users.find({'age':{'$nin':[18,19]}})
//查询年龄为18或者用户名为joe的用户
db.users.find({'$or':[{'age':18},{'username':'joe'}]})

4.2.3 $not

$not是元条件句,即可以在任何条件之上。 比如用$mod取模,会将查询的值除以第一个给定的值,若余数等于第二个至则匹配成功:

db.users.find({'id_num':{"$mod":[5,1]}})

返回 1,6,11,16。。。的用户

db.users.find({'id_num':{"$not":{"$mod":[5,1]}}})

返回 2,3,4,5,7,8,9...的用户

4.2.4条件语句

都是前面的查询 注意一下元操作符是在外层文档中, 如$or $and

4.3 特性类型的查询

4.3.1 null

db.users.find('name':null)

如果仅想匹配键值为null的文档,既要检查该键的值是否null,还要通过 $exists条件判断键值已存在:

db.users.find({'name':{'$in':[null],'$exists':true}})

4.3.2 正则表达式

db.users.find({'name':/joe/i})

系统接受正则表达式标志i,但不是一定要有。

db.users.find({'name':/joey?/i})

MongoDB使用perl兼容的正则表达式库来匹配正则表达式。

4.3.3 查询数组

db.users.find('name':['zhangsan','lisi','wangwu'])

如果需要多个元素来匹配数组,那就要使用$all了。

想要查询数组特定位置的元素,需要使用key.index语法指定下标:

db.foot.find({'title.2':'paht'})

$size可以用来查询特定长度的数组。

4.3.4 查询内嵌文档

有两种方法可以查询内嵌文档:查询整个文档,或者只针对其键/值进行查询。

例如如下文档:

{
    'name':{
        'first':'joe',
        'last':'scc'
    },
    'age':45
}

db.users.find({'name':{'first':'joe'}})

4.4 $where 查询

键值对是一种表达能力非常好的查询方式,但是依然有些需求他无法表达。其他方法都无法查询是 $where就可以登场了。

$where操作比较麻烦 详细以后在添加。

4.5 游标

数据库使用游标返回find的执行结果。

4.5.1 limit、skip和sort

最常用的查询选项就是限制返回结果的数量、忽略一定数量的结果以及排序:

db.c.find().limit(3)
db.c.find().skip(3)
#name升序,age降序
db.c.find().sort(name:1,age:-1)

这三个方法组合使用对于分页非常有用。

详细书本也不够详细。需要后面使用在添加。

4.5.3 高级查询选项

有两种类型的查询:简单查询和封装查询

4.5.4 获取一致结果

4.5.5 游标生命周期

4.6 数据库命令

有一种非常特殊的查询类型叫作数据库命令。前面已经介绍过文档的创建、更新删除以及查询、这些都是数据库命令的范畴。包括管理性的任务,统计集合内的文档数量以及执行聚合等。

本章节有很多理论上的东西。实际操作在实际修改添加。这里没有一一添加编写进来。

如果对您有用,请我喝杯咖啡吧。

赞助扫码::
../../../_images/apay.jpg ../../../_images/pay_wechat.png