MongoDB聚合查询
概念
聚合查询:
顾名思义就是把数据聚起来,然后统计
语法
db.集合名称. aggregate([ {管道:{表达式}} .... )
常用管道
$group 将集合中的文档分组,用于统计结果 Smatch 过滤数据,只要输出符合条件的文档 $sort 聚合数据进一步排序 $skip 跳过指定文档数 $7imit 限制集合数据返回文档数 …
常用表达式
$sum 总和 $sum:1同count表示统计 $avg 平均 $min 最小值 $max 最大值 …
##练习
准备:
use test4 db.c1.insert({_id:1,name:"a",sex:1,age:1}) db.c1.insert({_id:2,name:"b",sex:1,age:2}) db.c1.insert({_id:3,name:"c",sex:2,age:3}) db.c1.insert({_id:4,name:"d",sex:2,age:4}) db.c1.insert({_id:5,name:"e",sex:2,age:5})
- 统计男生、女生的总年龄
db.c1.aggregate([ { $group:{ _id:"$sex", re:{$sum:"$age"}}}])
- 统计男生女生的总人数
db.c1.aggregate([ { $group:{ _id:"$sex", rs:{$sum:1}}}])
- 求学生总数和平均年龄
db.c1.aggregate([ { $group:{ _id:null, total_num:{$sum:1}, total_avg:{$avg:"$age"}}}])
- 查询男生女生人数,按人数升序
//升序 db.c1.aggregate([ {$group:{ _id:"$sex", rs:{$sum: 1} }}, {$sort:{ rs:1 }} ]) //降序 db.c1.aggregate([ {$group:{ _id:"$sex", rs:{$sum: 1} }}, {$sort:{ rs:-1 }} ])
MongoDB优化索引
数据库中的索引
- 说明:索引是一种排序好的便于快速查询的数据结构
- 作用:帮助数据库高效的查询数据
##索引优缺点
优点
提高数据查询的效率,降低数据库的IO成本
通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗。
缺点
占用磁盘空间
大量索引影响SQL语句效率,因为每次插入和修改数据都需要更新索引
语法
- 创建索引语法: db.集合名.createlndex(待创建索引的列[,额外选项])
- 参数:
待创建索引的列:{键:1…,键:-1}
说明: 1升序 -1降序 例如{age:1}表示创建age索引并按照升序的方式存储额外选项: 设置索引的名称或者唯一索引等等
全部删除: db.集合名.dropIndexes()
删除指定: db.集合名.droplndex(索引名)
- 查看索引语法: db.集合名.getIndexes()
练习
注意:向数据库中新增十万条数据
//选择数据库 use test5 //向数据库中添加数据 for(var i = 0;i <100000;i++){ db.c1.insert({'name':"aaa"+i,"age":i}) }
创建普通索引
需 求: 给name添加普通索引 给name添加普通索引,命令:db.c1.createIndex({name:1}) 删除name索引,命令:db.c1.dropIndex("name_1") 给name创建索引并起名web 命令:db.c1.createIndex({name:1},{name:"web})
创建复合/组合索引
需求:给name和age添加组合索引
说明:就是一次性给两个字段建立索引
语法:db.集合名.createIndex({键1:方式,键2:方式})
创建唯一索引
需求:给name添加普通索引 语法: db.集合名.createIndex(待添加索引的列,{unique:列名}) 一:删除全部索引,命令:db.c1.dropIndexes() 二:设置唯一索引,命令:db.c1.createIndex({name:1},{unique:true})
分析索引
语法:
db.集合名.find().explain(‘executionStats’)
索引扫描方式
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
练习
测试:age未添加索引情况
语法:
db.c1.find({age:18}).explain('executionStats')
测试:age添加索引情况 语法:db.c1.createIndex({age:1}) 继续:db.c1.find({age:18}).explain('executionStats')
选择规则(如何选择合适的列创建索引)
- 为常做条件、排序、分组的字段建立索引
- 选择唯一性索引 (ps.同值较少如性别字段)
- 选择较小的数据列,为较长的字符串使用前缀索引 (ps.索引文件更小)
MongoDB权限机制
##语法:
db.createUser({ "user" :"账号"", "pwd":“密码", "roles" : [{ role: "角色", db:"所属数据库" }] })
角色
#角色种类
超级用户角色:root
数据库用户角色:reaH、 readwrite;
数据库管理角色:dbAdmin、userAdmin;
集群管理角色: clusterAdminclusterManager.clusterMonitor、hostManager;
备份恢复角色: backup、restore;
所有数据库角色: readAnyDatabase、readwriteAnyDatabase、userAdminAnyDatabdbAdminAnyDatabase
#角色说明
root:只在admin数据库中可用。超级账号,超级权限;
read:允许用户读取指定数据库;
readwrite:允许用户读写指定数据库;
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile;dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限;
开启验证模式
开启验证模式
开启验证模式概念:名词,指用户需要输入账号密码才能登陆使用操作步骤
1.添加超级管理员
2.退出卸载服务
3.重新安装需要输入账号密码的服务(注在原安装命令基础上加上–auth即可
4.启动服务->登陆测试
步骤1:添加超级管理员
mongo use admin db.createUser({ "user":"用户名", "pwd":"密码", "roles":[{ role: "root", db : "admin"}] }) 1 2
步骤2:退出卸载服务
bin\mongob --remove
注意:必须用管理员打开DOS窗口
步骤3:安装需要身份验证的MongoDB服务
bin \mongod --insta1l --dbpath E : \mongodb \ data --logpath E : \mongodb \ logs \mongodb2.1og --auth
步骤4:启动服务 -> 登陆测试
通过超级管理员账号登陆
- 方法1: mongo服务器IP地址:端口/数据库-u用户名-p密码
- 方法2: a-先登录,b-选择数据库,c-输入db.auth(用户名,密码)
MongoDB备份还原
备份数据库mongodump
语法:
导出数据语法: mongodump -h -port -u -p -d -o导出语法说明 -h host 服务器IP地址(一般不写默认本机 -port 端口(一般不写默认27017 -u user 账号 -p pwd 密码 -d database 数据库(留心:数据库不写则导出全局 -o open 备份到指定目录下
还原数据库mongorestore
语法:
还原数据语法: mongorestore -h -port -u -p-d–drop备份数据目录还原数据说明: -h host 服务器IP地址(一般不写默认本机 -port 端口(一般不写默认27017 -u user 账号 -p pwd 密码 -d database 数据库(留心:数据库不写则导出全局 -d 不写则还原全部数据 –drop 先删除数据库再导