人工智能(MongoDB)—— MongoDB的索引、聚合、固定集合及文件存储

一、索引

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

1、创建索引

        ensureIndex()
                功能 : 创建索引
                参数 : 索引类别(索引域),索引选项

                e.g. 根据name 创建索引
                db.class0.ensureIndex({'name':1})

                        * 1表示为该域创建正向索引,-1 表示逆向索引
                        * _id 域会自动创建索引

                e.g. 自定义索引名称
                db.class1.ensureIndex({name:1},{name:'name_index'})

2、查看索引

        getIndexes()

                e.g. 查看class0表中的索引
                db.class0.getIndexes()

3、删除索引

        dropIndex()
                功能 : 删除索引
                参数 : 删除索引的名称

                e.g. 可以通过索引名称或者索引键值对删除
                db.class0.dropIndex('name_1')
                db.class0.dropIndex({name:1})

        dropIndexes()
                功能 : 删除所有索引

                e.g.  
                db.class0.dropIndexes()

二、索引类型

1、复合索引

        根据多个域创建一个索引
                e.g.
                db.class0.ensureIndex({name:1,age:-1})

2、数组索引

        如果对某个数组域创建索引,那么表示对数组中的每个值均创建了索引,通过数组中单个值查询,也是索引查询
                e.g.
                db.class1.ensureIndex({'score':1})

3、子文档索引

        如果对一个域创建索引,值是一个文档则子文档也会同时形成索引
        如果对子文档某一个域进行索引创建,则只有通过子文档中的该域查找时为索引查找
                e.g.
                db.class2.ensureIndex({'publication.pulisher':1})

4、覆盖索引

        查找时只获取索引项的内容,而不必去获取原数据中的其他内容,这样就不去连接原来的数据直接返回即可
                e.g. name为索引项,显示也只要name域
                db.class0.find({name:'Lily'},{_id:0,name:1})

5、唯一索引

        创建索引时希望索引域的值均不相同,也可以据此限制一个域的值
                e.g.
                db.class0.ensureIndex({name:1},{'unique':true})

        *当对某个域创建了唯一索引后,即不允许在插入相同的值的文档

6、稀疏索引(间隙索引)

        只针对有指定域的文档创建索引表,没有该域的文档,不会插入到索引表中
                e.g.
                db.class2.ensureIndex({'date':1},{sparse:true})

7、索引约束

        1.影响数据的插入,删除,修改操作。当数据发生改变时,索引表必须同步更新
        2.索引也是需要占用一定的空间资源

综上 :
        当数据库大量的操作是插入,修改,删除操作,而非查询操作时,不适合创建索引。
        数据量比较小时,考虑到空间成本也不适合创建索引。
        即使适合创建索引的情况,也不是索引越多越好。

三、聚合

        对文档的更高级的筛选整理统计

        db.collectionName.aggregate()
                功能 : 聚合函数,配合聚合条件进行数据整理统计
                参数 : 聚合条件  

 

聚合操作符含义示例意思
$group

分组聚合;

需要配合分组统计操作符使用,

确定按什么分组

  
$project用于修改文档的显示效果db.class0.aggregate({$project:{_id:0,name:1,age:1}})

db.class0.aggregate({$project:{_id:0,Name:'$name',Age:'$age'}})

显示name和age域

指定显示域名

$match过滤数据db.class0.aggregate({$match:{age:{$gt:16}}})过滤年龄大于16的
$skip跳过前几条文档db.class0.aggregate({$skip:2}) 
$limit显示前几条文档db.class0.aggregate({$limit:2}) 
$sort排序db.class0.aggregate({$sort:{name:1}}) 

分组统计

操作符

($group配合)

含义示例意思
$sum求和

db.class0.aggregate({$group:{_id:'$gender',num:{$sum:1}}})

                       聚合       分组    按gender分组  统计结果名

统计每组个数
$avg求平均数db.class0.aggregate({$group:{_id:'$gender',num:{$avg:'$age'}}}) 
$min求最小值db.class0.aggregate({$group:{_id:'$gender',name:{$min:'$name'}}})求每组姓名的最小值
$max求最大值db.class0.aggregate({$group:{_id:'$gender',name:{$max:'$name'}}})求每组姓名的最大值
$first 

db.class0.aggregate({$group:{_id:'$gender',name:{$first:'$name'}}})

返回每组第一个文档指定域值
$last db.class0.aggregate({$group:{_id:'$gender',name:{$last:'$name'}}})返回每组最后一个文档指定域值

1、聚合管道

        将前一个聚合操作的结果给下一个聚合操作继续执行

        db.collectionName.aggregate([聚合1,聚合2,.....])

                e.g.   match---> project ---> sort
                db.class0.aggregate([{$match:{name:{$gt:'Tom'}}},{$project:{_id:0,name:1,age:1}},{$sort:{name:-1}}])

                e.g.  group ---> match
                db.class0.aggregate([{$group:{_id:'$gender',num:{$sum:1}}},{$match:{$nor:[{_id:'m'},{_id:'w'}]}}])

2、示例

        使用之前的grade数据库
        增加分数域 score:{'chinese':88,'english':78,'math':98}

                1. 按照性别分组统计每组人数
                aggregate({$group:{_id:'$sex',num:{$sum:1}}})

                2. 按照姓名分组,过滤出有重名的同学
                aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

                3. 统计每名男生的语文成绩
                aggregate([{$match:{sex:'m'}},{$project:{_id:0,name:1,'score.chinese':1}}])

                4. 将女生按照英语分数降序排列
                aggregate([{$match:{sex:'w'}},{$sort:{'score.english':-1}}])

四、固定集合

        mongodb中可以创建大小固定的集合,称之为固定集合。

        特点:
                插入速度快,顺序查找速度快
        能够淘汰早期数据
                可以控制集合大小

        适用场景:
                临时缓存
        日志处理

1、固定集合的创建

        db.createCollection(collectionName,{capped:true,size:10000,max:1000})
                capped:true    表示创建固定集合
                size : 表示集合的大小  bytes    4.0最小 4096   单位kb
                max : 表示最多存放多少文档

        e.g. 创建一个最多包含三条文档的集合
        db.createCollection('log',{capped:true,size:10,max:3})

五、文件存储

        文件存储到数据库方式

        1. 存储路径
                将文件在本地的路径以字符串形式存储到数据库

                优点:节省数据库空间
                缺点:当数据库或者文件位置发生变化时文件丢失。

        2. 存储文件本身
                以二进制方式将文件存储到数据库

                优点:数据库和文件绑定存在
                缺点:占用空间大,结构化麻烦

1、mongodb存储二进制文件

        * GridFS方法存储大文件(mongo系统大于16M的文件为大文件)  
        * 将文件转化为二进制,进行插入  Binary data

        在mongodb数据库中创建两个集合共同完成对文件的存储
        fs.files:存储文件的相关信息,比如:文件名、文件类型
        fs.chunks:实际存储文件内容,以二进制方式分块存储。将大文件分为多个小块,每块占一个空间。

2、向数据库存储文件

        mongofiles -d  dbname   put   file
                                     数据库         要存储的文件
        *如果数据库不存在则自动创建

fs.files
{ "_id" : ObjectId("5b0770c169d72e1e3a6eebda"), "chunkSize" : 261120, "uploadDate" : ISODate("2018-05-25T02:11:13.986Z"), "length" : 8313457, "md5" : "4b39deb86dcb6ece44ef52a69dcd6e1a", "filename" : "xly.zip" }

fs.chunks
{ "_id" : ObjectId("5b0770c169d72e1e3a6eebee"), "files_id" : ObjectId("5b0770c169d72e1e3a6eebda"), "n" : 19, "data" : BinData(0,"wGTrj3......)}

3、获取数据库中文件

mongofiles -d grid get xly.zip

4、Grid的优缺点

        优点 : 存储方便,方便数据库移植,对文件个数没有太多限制
        缺点 : 读写效率低

六、附录:目录

        人工智能(MongoDB)—— 目录汇总

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值