跳转至

5. 索引聚合

索引

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

ensureIndex()
    功能
        创建索引
    参数
        索引域和索引选项
        1 表示正序索引
        -1 表示逆序索引

根据name域创建索引
db.exe.ensureIndex({name:1})

查看集合中索引
    db.collection.getIndexes()

自定义索引名称
    db.collection.ensureIndex({}, {name:'MyIndex'})
    对age域创建索引命名ageIndex
        db.exe.ensureIndex({age:1},{name:'ageIndex'})

删除索引
    db.collection.dropIndex('index')
    功能
        删除索引
    参数
        要删除的索引名或键值对
    示例
        删除age索引
        db.exe.dropIndex({age:1})
        db.exe.dropIndex('name_1')

删除所有索引
    db.collecction.dropIndexes()
    功能
        删除所有索引

_id是系统自动创建的主键索引, 不能删除

复合索引

根据多个域创建一个索引,比单独创建索引表更省空间
db.exe.ensureIndex({name:1, age:-1}, {name:'name_age'})

数组索引,子文档索引

如果对某个域的值为数组或者为子文档的域创建索引,那么通过数组或者子文档中某一项进行查找也是索引查找
例如:
如果多score创建了索引,那么该查找就是索引查找
db.exe.find({'score.1':88})

唯一索引

创建索引的域要求值不能重复
db.exe.ensureIndex({age:1},{unique:true})

稀疏索引(间隙索引)

只针对有指定索引域的文档创建索引,没有该域的文档不会插入到索引表
例如
只对有age域的文档创建索引
db.exe.ensureIndex({age:1},{sparse:true})

索引约束

  • 索引表需要占用一定的数据库物理磁盘空间
  • 当对数据进行增删改等写入操作时索引也需要更新,降低了数据修改的效率

综上:
1. 数据量较小时不适合创建索引, 当数据库进行频繁的修改操作而不是查找操作时也不适合创建索引.
2. 针对一个集合并不是创建索引越多越好

聚合操作

对文档的筛选结果进行整理统计

db.collection.aggregate()
功能
    完成集合操作
参数
    聚合条件 ---> 聚合操作符

聚合操作符

$group  分组聚合
    需要配合具体的分组统计选项

$sum 求和
    例如
         db.exe.aggregate({$group:{_id:'$sex',num:{$sum:1}}})
         db.exe.aggregate({$group:{_id:'$sex',num:{$sum:'$age'}}})

$avg 求平均数
    例如
        按性别分组,统计平均年龄
            db.exe.aggregate({$group:{_id:'$sex',avg:{$avg:'$age'}}})

$max 求最大值
    例如
        按性别分组求年龄的最大值
        db.exe.aggregate({$group:{_id:'$sex', max:{$max:'$age'}}})

$min 求最小值
    例如
        按性别分组求年龄的最小值
        db.exe.aggregate({$group:{_id:'$sex', min:{$min:'$age'}}})

$project
    修改文档的显示效果
    $project 值得用法和find函数field格式一致
        db.exe.aggregate({$project:{_id:0,name:1, age:1}})

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

$match
    数据筛选
        用法和query的用法一致
        筛选大于18岁的文档
        db.exe.aggregate({$match:{age:{$gt:18}}})

$limit
    筛选前几条文档
        筛选到前三条数据
        db.exe.aggregate({$limit:3})


$skip
    跳过几条文档显示
        db.exe.aggregate({$skip:3})

$sort
    将数据排序
            db.exe.aggregate({$sort:{age:1}})


聚合管道
    将上一个聚合的操作结果给下一个聚合继续操作
        db.collection.aggregate([{聚合},{},{},{}])