mongodb 索引


索引 : 指的是建立指定键值及所在文档存储位置的对照关系清单。使用索引可以更方便我们快速查找,减少遍历,提高效率。
如果不适用索引则在查找中使用全表扫描,效率较低


创建索引:


ensureIndex


给student集合中按照name创建索引
db.student.ensureIndex({'name':1})


* 1表示正向索引,-1表示逆向索引,根据需要进行创建


查看当前集合中的索引
getIndexes()


e.g.:
db.student.getIndexes()
* 默认情况下_id是系统自动为我们创建的索引


创建复合索引 (可以同时给多个域创建索引)


e.g.:
db.student.ensureIndex({'name':1,'age':-1})


删除索引
dropIndex()


db.student.dropIndex({'name':1})


删除所有索引
db.student.dropIndexes()
* 注意 不会删除_id上的索引


显示查找操作的详细信息
explain()


索引类型:


数组索引 : 如果对某个域创建索引,这个域对应的值是一个数组。那么会对数组中的每个值依次创建索引
目的 : 提高数组查找的效率


e.g.:


db.student.find({hobby:'football'},{_id:0})


子文档索引
如果某个域的值是一个文档,那么可以针对这个子文档中的某个域单独创建子文档索引。
e.g.:


db.class2.ensureIndex({'book.price':1})


唯一索引 :


唯一索引希望创建索引的键都拥有不重复的值。
可以通过创建唯一索引来约束键对应的值


db.student.ensureIndex({name:1},{'unique':true})


覆盖索引


定义:不获取具体文档,仅从索引中就可以获取到全部的查询数据


如何使用: 查询时,限定返回的数据仅包含索引中的数据,排除不再索引中的键


db.student.ensureIndex({name:1,age:1})


只显示索引项
db.student.find({name:'Levi'},{_id:0,name:1})


稀疏索引(间隙索引):


只针对有score域的文档进行索引创建,跳过不存在这个域的文档


db.student.ensureIndex({score:1},{sparse:true})


文本索引:


使用文本索引可以较快速的进行文本检索,文本索引可以建立在任何格式的字符串上。


1.创建文本索引


db.class1.ensureIndex({Geyan:'text',description:'text'})


2. 以空格作为分割,只要对应文本中包含其中一部分就可以找到相应的文档


db.class1.find({$text:{$search:"python java PHP"}})


3.如果查找的字符串中本身包含空格 则使用内部引号引起来


db.class1.find({$text:{$search:"\"love python\""}},{_id:0})


4.可以检索出不包含某个字符串的文档


查找包含 I  love  但是不包含go的文档
db.class1.find({$text:{$search:"'i love' -go"}},{_id:0})


5 删除文本索引


*先用getIndexes()查看文档的名字
*按照名字进行删除
e.g.:
db.class1.dropIndex('Geyan_text_description_text')


索引约束:
1.影响插入,删除,修改数据的效率,当对数据的修改发生时,不仅需要更新文档,还需要更新索引


2.占用了一定的存储空间,在数据量较小的集合中不宜创建索引。
综上 :索引不是越多越好,而是看实际对数据的常用操作


固定集合:


mongo中固定集合指的是性能出色且有着固定大小的集合


作用: 处理日志
       作为缓存


特点:插入数据块
      顺序查询速度快 
能够淘汰早期数据

db.createCollection('collectionName',{capped:true,size:10000})


e.g.:
db.createCollection('log',{capped:true,size:10000})
判断一个集合是否是固定集合
db.log.isCapped()


设置固定集合中最多有1000条数据 大小是10000kb
db.createCollection('mylog',{capped:true,size:10000,max:1000})

聚合

主要用于文档数据的统计计算。
db.class1.count()  统计集合中有多少文档


聚合方法 配合一定的聚合标识符来使用
db.class1.aggregate()


聚合标识符
$group  分组 


$sum    求和
$avg    求平均数
$min    得到最小值
$max    得到最大值
$first  得到每组第一个
$last   得到每组最后一个 


{$group:{_id:"$name"  ,  num:           {$sum:1}}}
  分组      按照姓名  分组统计结果名称   求和


统计每个姓名的人数
db.class3.aggregate({$group:{_id:"$name",num:{$sum:1}}})
统计每名字的人的年龄之和
db.class3.aggregate({$group:{_id:"$name",num:{$sum:'$age'}}})
统计每名字的人的平均年龄
db.class3.aggregate({$group:{_id:"$name",num:{$avg:'$age'}}})
统计每名字的人的最小年龄
db.class3.aggregate({$group:{_id:"$name",num:{$min:'$age'}}})
统计每名字的人的最大年龄
db.class3.aggregate({$group:{_id:"$name",num:{$max:'$age'}}})
统计每名字的人的第一个的年龄
db.class3.aggregate({$group:{_id:"$name",num:{$first:'$age'}}})
统计每名字的人的最后一个的年龄

db.class3.aggregate({$group:{_id:"$name",num:{$last:'$age'}}})

$project 


用于修改文档的显示结构


只显示name和age 同 find({},{_id:0,name:1,age:1})


db.student.aggregate({$project:{_id:0,name:1,age:1}})


显示数据中增加一个域Name,值是原来name域的值

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

* 当我们需要告知是哪个字段的时候是不必加$的
* 当我们需要得到这个字段的值得时候,需要加$


$match
用于过滤数据
db.student.aggregate({$match:{'age':18}})

db.student.aggregate({$match:{'age':{$gt:18}}})

$limit
取多少条结果
db.student.aggregate({$limit:2})

$skip

跳过多少条

db.student.aggregate({$skip:2})

$sort
排序
db.student.aggregate({$sort:{age:1}})

聚合管道:
前一个的聚合结果传给后一个继续操作
将match的结果,按照project输出结构输出,并按照sort排序
db.student.aggregate([{$match:{'age':{$gte:18}}},{$project:{_id:0,name:1,age:1}},{$sort:{age:1}}])


聚合练习
创建一个数据库 名字为 grade 
数据库中创建集合集合名称为 class 
向集合中插入若干文档文档结构如下
{name:‘小红’,age:10,sex:‘w’,hobby:['a','b'],score:{‘chinese’:88,‘english’:76,‘math’:91}}

1. 按照学生姓名进行分组,统计每组的人数
2. 按照学生姓名分组,统计人数,过滤人数大于1的学生

db.class.aggregate([{$group:{_id:'$name',num:{$sum:1}}},{$match:{num:{$gt:1}}}])

3.统计每名学生在考试中的总分 

db.class.aggregate([{$group:{_id:'$_id',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])

4.统计每名男生考试中的总分
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}}])

5.统计每名男生考试中的总分,按降序显示
db.class.aggregate([{$match:{sex:'m'}},{$group:{_id:'$name',score:{$sum:{$sum:['$score.chinese','$score.english','$score.match']}}}},{$sort:{score:-1}}])

-----------------------------------------------------------------------------------------------------
GridFS
GridFS是mongo提供的一种文件的存储方式。
当文件大小 大于16M的时候可以使用这种方式进行存储
将文件存储在mongodb的集合中,通过两个集合共同维护该文件的存储
fs.files : 存储和文件相关的数据,文件名filename,文件类型content_type等


fs.chunks: 实际存储文件内容,以二进制方式分块存储

大文件会被分割为多个小块,每块作为fs.chunks集合中文档进行存储

存储文件 
mongofiles -d  dbName put  filename
dbName : 将文件存储在哪个数据库,如果不存在则自动创建该数据库

filename:要存储的文件的名字 (大于16M)路径


查看存储的文件
db.fs.files.find()
从上一个命令获取对应文件的_id值,得到具体文件
db.fs.chunks.find({files_id:ObjectId(xxxxxxx)})

优缺点 
优点: 1.存储方便
           2.没有文件个数限制
   3.加载方便

缺点 : 读写效率低 (比硬盘读写文件效率低)
        只能整体替换,不能分块更新


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章