Skr-Eric的MongoDB课堂(五)——MongoDB的索引、聚合、固定集合和文件

索引

指建立指定键值及所在文档存储位置的对照清单,使用索引可以方便我们进行快速查找,减少遍历次数提高查找效率

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的编程课堂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器学习模型机器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值