指建立指定键值及所在文档中存储位置的对照清单。使用索引可以方便我们进行快速查找,减少遍历次数,提高查找效率。
ensureIndex()
功能 : 创建索引
参数 : 索引类别(索引域),索引选项
e.g. 根据name 创建索引
db.class0.ensureIndex({'name':1})
* 1表示为该域创建正向索引,-1 表示逆向索引
* _id 域会自动创建索引
e.g. 自定义索引名称
db.class1.ensureIndex({name:1},{name:'name_index'})
getIndexes()
e.g. 查看class0表中的索引
db.class0.getIndexes()
dropIndex()
功能 : 删除索引
参数 : 删除索引的名称
e.g. 可以通过索引名称或者索引键值对删除
db.class0.dropIndex('name_1')
db.class0.dropIndex({name:1})
dropIndexes()
功能 : 删除所有索引
e.g.
db.class0.dropIndexes()
根据多个域创建一个索引
e.g.
db.class0.ensureIndex({name:1,age:-1})
如果对某个数组域创建索引,那么表示对数组中的每个值均创建了索引,通过数组中单个值查询,也是索引查询
e.g.
db.class1.ensureIndex({'score':1})
如果对一个域创建索引,值是一个文档则子文档也会同时形成索引
如果对子文档某一个域进行索引创建,则只有通过子文档中的该域查找时为索引查找
e.g.
db.class2.ensureIndex({'publication.pulisher':1})
查找时只获取索引项的内容,而不必去获取原数据中的其他内容,这样就不去连接原来的数据直接返回即可
e.g. name为索引项,显示也只要name域
db.class0.find({name:'Lily'},{_id:0,name:1})
创建索引时希望索引域的值均不相同,也可以据此限制一个域的值
e.g.
db.class0.ensureIndex({name:1},{'unique':true})
*当对某个域创建了唯一索引后,即不允许在插入相同的值的文档
只针对有指定域的文档创建索引表,没有该域的文档,不会插入到索引表中
e.g.
db.class2.ensureIndex({'date':1},{sparse:true})
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'}}}) | 返回每组最后一个文档指定域值 |
将前一个聚合操作的结果给下一个聚合操作继续执行
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'}]}}])
使用之前的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中可以创建大小固定的集合,称之为固定集合。
特点:
插入速度快,顺序查找速度快
能够淘汰早期数据
可以控制集合大小
适用场景:
临时缓存
日志处理
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. 存储文件本身
以二进制方式将文件存储到数据库
优点:数据库和文件绑定存在
缺点:占用空间大,结构化麻烦
* GridFS方法存储大文件(mongo系统大于16M的文件为大文件)
* 将文件转化为二进制,进行插入 Binary data
在mongodb数据库中创建两个集合共同完成对文件的存储
fs.files:存储文件的相关信息,比如:文件名、文件类型
fs.chunks:实际存储文件内容,以二进制方式分块存储。将大文件分为多个小块,每块占一个空间。
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......)}
mongofiles -d grid get xly.zip
优点 : 存储方便,方便数据库移植,对文件个数没有太多限制
缺点 : 读写效率低
人工智能(MongoDB)—— 目录汇总