索引 : 指的是建立指定键值及所在文档存储位置的对照关系清单。使用索引可以更方便我们快速查找,减少遍历,提高效率。
如果不适用索引则在查找中使用全表扫描,效率较低
创建索引:
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.加载方便
缺点 : 读写效率低 (比硬盘读写文件效率低)
只能整体替换,不能分块更新