索引
指建立指定键值及所在文档存储位置的对照清单,使用索引可以方便我们进行快速查找,减少遍历次数提高查找效率
ensureIndex()
功能 : 创建索引
参数 : 索引域和索引选项
e.g. 根据name域创建索引
db.class0.ensureIndex({name:1})
* 1表示正序索引 -1表示逆序索引
查看集合中索引
db.collection.getIndexes()
自定义索引名称
db.collection.ensureIndex({},{name:'myIndex'})
e.g. 对age域创建索引命名ageIndex
db.class0.ensureIndex({age:1},{name:'ageIndex'})
删除索引
db.collection.dropIndex("index")
功能:删除索引
参数: 要删除的索引名称或者键值对
e.g.
db.class0.dropIndex({name:1})
db.class0.dropIndex('ageIndex')
db.collection.dropIndexes()
功能:删除所有索引
* _id是系统自动创建的主键索引,不能删除
索引类型
复合索引
根据多个域创建一个索引
e.g.
db.class0.ensureIndex({name:1,age:-1},{name:'name_age'})
数组索引 ,子文档索引
如果对某个域的值为数组或者子文档的域创建索引,那么通过数组或者子文档中某一项进行查找也是索引查找
e.g. 如果对score创建了索引那么该查找就是索引查找
db.class1.find({'score.1':88})
唯一索引
创建索引的域要求值不能够重复
e.g. 对name创建唯一索引
db.class0.ensureIndex({name:1},{unique:true})
* 当对某个域创建了唯一索引就不能插入重复的值
稀疏索引(间隙索引)
只针对有指定索引域的文档创建索引,没有该域的文档不会插入到索引表
e.g. 只对有age域的文档创建索引
db.class0.ensureIndex({age:1},{sparse:true})
索引约束
* 索引表需要占用一定的数据库磁盘空间
* 当对数据进行增 删 改等写入操作时索引也需要更新,降低了数据修改的
综上 : 数据量较小时不适合创建索引,当数据库进行频繁的修改操作而不是查找操作时也不适合创建索引。针对一个集合并不是创建索引越多越好。
聚合操作
对文档的筛选结果进行整理统计
db.collection.aggregate()
功能 : 完成聚合操作
参数 : 聚合条件 ---》 聚合操作符
聚合操作符
$group 分组聚合 需要配合具体的分组统计选项
$sum : 求和
e.g.
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})
db.class0.aggregate({$group:{_id:'$gender',num:{$sum:'$age'}}})
$avg : 求平均数
e.g. db.class0.aggregate({$group:{_id:'$gender',avg:{$avg:'$age'}}})
$max 求最大值
e.g.
db.class0.aggregate({$group:{_id:'$gender',max:{$max:'$age'}}})
$min 求最小值
e.g.
db.class0.aggregate({$group:{_id:'$gender',min:{$min:'$age'}}})
$project
修改文档的显示效果
e.g. project值得用法和find函数field格式一致
db.class0.aggregate({$project:{_id:0,name:1,age:1}})
db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})
$match
数据筛选
$match值得用法同query一致
e.g. 过滤年龄大于18岁的数据文档
db.class0.aggregate({$match:{age:{$gt:18}}})
$limit
筛选前几条文档
e.g. 筛选前三条数据文档
db.class0.aggregate({$limit:3})
$skip
跳过几条文档显示
e.g. 跳过前三条文档
db.class0.aggregate({$skip:3})
$sort
将数据排序
e.g. 按照年龄排序
db.class0.aggregate({$sort:{age:1}})
聚合管道
聚合管道指的是将上一个聚合的操作结果给下一个聚合继续操作
db.collection.aggregate([{聚合},{},{}...])
e.g. match --> project --> sort
db.class0.aggregate([{$match:{gender:'m'}},{$project:{_id:0}},{$sort:{age:1}}])
e.g. group ---> match 找到重名学生
db.class0.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])
固定集合
mongodb中可以创建大小固定的集合,称之为固定集合
特点: 能够淘汰早期数据
插入和顺序查找速度更快
可以控制集合的空间大小
使用: 临时缓冲
日志处理
创建固定集合
db.createColleciton(collection,{capped:true,size:10000,max:1000})
capped:true 表示创建固定集合
size: 表示指定集合的大小 字节
max: 指定集合存放文档上限
e.g. 创建固定集合,size为1000 最多存3条文档
db.createCollection('log',{capped:true,size:1000,max:3})
文件存储
1. 存储文件路径
e.g.
db.log.insert({filename:'test.mp4',size:247.8,path:"/home/tarena/mongodb/test.mp4"})
优点 : 节省数据库空间
操作简单快捷
缺点 : 当数据库或者文件位置发生变化时需要修改数 据库内容
2. 存储文件本身
将文件以二进制的形式存储到数据库中
优点 : 数据库在文件就在,不会受到迁移等影响
缺点 : 占用数据库空间大
存取效率低
GridFS存储大文件
大文件 : 在mongodb中认为 >16M 的文件为大文件
GridFS 方法
在mongodb中以两个集合配合的方法存储文件
fs.files : 存储文件相关信息(文件名,文件类型)
fs.chunks :分块存储文件实际内容
存储文件:
mongofiles -d dbname put file
dbname : 要将文件存入的数据库,如果不存在自动创建
file : 要保存的文件
e.g. 将test.mp4存入grid数据库
mongofiles -d grid put test.mp4
fs.files结构
{ "_id" : ObjectId("5ba452a869d72e12d5cd4e46"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-09-21T02:09:04.193Z"), "length" : 247759369, "md5" : "a94853f4f64b3e87bf98aea770855615", "filename" : "test.mp4" }
fs.chunks结构
{ "_id" : ObjectId("5ba452a869d72e12d5cd4e59"), "files_id" : ObjectId("5ba452a869d72e12d5cd4e46"), "n" : 18, "data" : BinData(0,"G2.....qRv") }
提取文件:
mongofiles -d dbname get file
e.g.
mongofiles -d grid get test.mp4
优缺点
优点 : 操作方便,提供较好的存储命令,使用数据库存储文件方便移植
缺点 : 读写效率低
想要看更多的课程请微信关注SkrEric的编程课堂