数据查询
find()方法
db.集合名称.find({条件文档})
findOne()方法 只返回一个
db.集合名称.findOne({条件文档})
pretty() 将结果格式化
db.集合名称.find({条件文档}).pretty()
比较运算符
- 等于,默认是等于判断,没有运算符
- 小于$lt
- 小于或等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
例如:
# 查询名称是spirit的学生
db.stu.find({name:"spirit"})
# 查询年龄大于或等于18的学生
db.stu.find({age:{$gte:18}})
逻辑运算符
and:在json中写多个条件即可
查询年龄大于或等于18的,并且性别为true的学生
db.stu.find({age:{$gte:18},gender:true})
or:用$or,值为数组即列表,数组中每个元素为json
查询年龄大于18,或者性别为false的学生
db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})
and 和or 同时
查询年龄大于18或者性别为男生,并且姓名是小红的学生
`db.stu.find({or:[{age:{ or:[{age:{ gte:18}},{gender:true}],name:’smallred’})
范围运算符
使用
$in
,$nin
判断是否在某个范围内查询年龄为18,28的学生
db.stu.find({age:{$in:[18,28]}})
支持正则表达式
MongoDB提供的终端shell,也是一个js执行器,可以编写js代码和函数
使用
//
或者$regex
编写正则表达式db.stu.find({name:/^黄/})
db.stud.find({name:{$regex:'^黄'}})
自定义查询
使用
$where
后面写一个函数,返回满足条件的数据查询年龄大于30的学生
db.stu.find({ $where:function(){ return this.age>30; } })
limit和skip
limit()方法,用户读取指定数量的文档
db.集合名称.find().limit(NUMBER)
- 参数NUMBER表示要获取文档的条数
db.stu.find().limit(2)
查询两条学生信息skip()方法,用于跳过指定数量的文档
db.集合名称.find().skip(NUMBER)
- 参数NUMBER表示跳过的记录条数,默认值为0
db.stu.find().skip(2)
查询从第三条开始的学生信息limit和skip一起用
查询第5指8条数据
db.stu.find().limit(4).skip(5)
或者
db.stu.find().skip(5).limit(4)
投影
在查询到的返回结果中,只选择必要的字段
db.集合名称.find({},{字段名称:1,…})
参数为字段与值,值为1表示显示,值为0表示不显示
对于_id列默认是显示的,如果不显示需要明确设置为0
db.stu.find({},{_id:0,name:1,gender:1})
排序
sort()方法,用于对结果集进行排序
db.集合名称.find().sort({字段:1,…})
参数1位升序排列
参数-1位降序排列
db.stu.find().sort({gender:-1,age:1})
统计个数
方法count(),用于统计结果集中文档条数
- 方式1
db.集合名称.find({条件}).count()
- 方式2
db.集合名称.count({条件})
例如:
统计男生人数
db.stu.find({gender:true}).count()
统计年龄大于20的男生人数
db.stu.count({age:{$gt:20},gender:true})
- 方式1
消除重复
distinct()方法,对数据进行去重
db.集合名称.distinct('去重字段',{条件})
查找年龄大于18的学生
db.stu.distinct('hometown',{age:{$gt:18}})
聚合aggregate
聚合主要用于计算数据,类似于sql中的sum(),avg()
db.集合名称.aggregate({管道:{表达式}})
- 管道类似于Linux中命令里的管道,有同样作用
- 常用管道
- $group:将集合中的文档分组,可用于统计结果
- $match:过滤数据,只输出符合条件的文档
- $project:修改输入文档的结构,如重命名、增加、删除字段、创建计算结果
- $sort:将输入文档排序后输出
- $limit:限制聚合管道返回的文档数
- $skip:跳过指定数量的文档,并返回余下的文档
- $unwind:将数组类型的字段进行拆分
表达式
处理输入文档并输出
表示式:'$列名'
常用表达式
$sum
:计算总和,$sum:1 表示以一倍计数$avg
:计算平均值$min
:获取最小值$max
:获取最大值$push
:在结果文档中插入值到一个数组中$first
:根据资源文档的排序获取第一个文档数据$last
:根据资源文档的排序获取最后一个文档数据
$group
将集合中的文档分组,用于统计结果
-id表示分组的一句,使用某个字段的格式为
$字段
db.stu.aggregate( {$group: { _id:'$gender', counter:{$sum:1} } } )
$match
- 用于过滤数据,只输出符合条件的文档
查询年龄大于20的学生
db.stu.aggregate( {$match:{age:{$gt:20}}} )
$project
修改输入文档的结构,如重命名,增加,删除字段,创建计算结果
查询学生的姓名,年龄
db.stu.aggregate( {$project:{_id:0,name:1,age:1}} )
查询男生女生人数,输出人数
db.stu.aggregate( {$group:{_id:'$gender',counter;{$sum:1}}}, {$project:{_id:0,counter:1}} )
$sort
将输入文档排序后输出
查询学生信息,按年龄升序
b.stu.aggregate({$sort:{age:1}})
查询男生,女生人数,按人数降序
db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:-1}} )
$limit 和$skip
$limit
限制聚合管道返回的文档数
查询2条学生信息
db.stu.aggregate({$limit:2})
$skip
跳过指定数量的文档,并返回余下的文档
查询从第三条开始的学生信息
db.stu.aggregate({$skip:2})
统计男生,女生人数,按人数升序,取第二条数据
db.stu.aggregate( {$group:{_id:'$gender',counter:{$sum:1}}}, {$sort:{counter:1}}, {$skip:1}, {$limit:1} )
$unwind
- 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
db.集合名称.aggregate({$字段名称'})
例如:
db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']}) db.t2.aggregate({$unwind:'$size'}) # 结果如下 { "_id" : 1, "item" : "t-shirt", "size" : "S" } { "_id" : 1, "item" : "t-shirt", "size" : "M" } { "_id" : 1, "item" : "t-shirt", "size" : "L" }
对某字段值进行拆分
处理非空数组,非数组,无字段,null情况
属性preserveNullAndEmptyArrays值为false表示丢弃属性值为空的文档
属性preserveNullAndEmptyArrays值为true表示保留属性值为空的文档
db.inventory.aggregate({ $unwind:{ path:'$字段名称', preserveNullAndEmptyArrays:<boolean> #防止数据丢失 } })
索引
创建索引提升查询速度
在默认情况下创建的索引均不是唯一索引
创建唯一索引
db.t1.ensureIndex({"name:1"},{"unique":true})
联合索引,对多个属性建立一个索引,按照find()出现的顺序
`db.t1.ensureIndex({name:1,age:1})
查看文档所有索引
db.t1.getIndexes()
删除索引
db.t1.dropIndex('索引名称')