三、MongoDB高级操作
排序&分页
准备数据
1 | use test3 |
排序
1 | db.集合名.find().sort(JSON数据) |
Limit与Skip方法
1 | db.集合名.find().sort().skip(数字).limit(数字) |
- skip跳过指定数量(可选)
- limit限制查询的数量
使用
.count()
可以统计数量
实例练习
跳过0条数据,查询两条
1
2db.c1.find().sort({age:-1}).skip(0).limit(2)
db.c1.find().sort({age:-1}).limit(2)跳过两条数据,查询两条数据
1
db.c1.find().sort({age:-1}).skip(2).limit(2)
数据库1-10数据,每页显示两条
1
db.集合名.find().skip().limit(2)
skip计算公式:(当前页-1)* 每页显示条数
聚合查询
1 | db.聚合名称.aggregate([ |
常用管道 | 说明 |
---|---|
$group | 将集合中的文档分组,用于统计结果 |
$match | 过滤数据,只要输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
常用表达式 | 说明 |
---|---|
$sum | 总和 $sum:1 同count 表示统计 |
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
实例练习
准备数据
1 | use test4 |
_id
键表示按哪一个字段分组,需要显示的列新增字段即可。
统计男生、女生的总年龄
1
2
3
4
5
6
7
8db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:"$age"}
}
}
])统计男生、女生的总人数
1
2
3
4
5
6
7
8db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:1}
}
}
])求学生总数和平均年龄
1
2
3
4
5
6
7
8
9db.c1.aggregate([
{
$group:{
_id:null,
total_num:{$sum:1},
total_avg:{$avg:"$age"}
}
}
])查询男生、女生人数,按人数升序
1
2
3
4
5
6
7
8
9
10
11db.c1.aggregate([
{
$group:{
_id:"$sex",
rs:{$sum:1}
}
},
{
$sort:{rs:1}
}
])
索引
创建索引
1 | db.集合名.createIndex(带创建索引的列[,额外选项]) |
带创建索引的列:{键:1,键:-1}
1表示升序,-1表示降序
额外选项
设置索引的名称或者唯一索引等等
删除索引
全部删除
1
db.集合名.dropIndexes()
删除指定
1
db.集合名.dropIndex(索引名)
查看索引语法
1 | db.集合名.getIndexes() |
实例练习
数据准备
1 | //选择数据库 |
给name添加普通索引
1
db.c1.createIndex({name:1})
删除name索引
1
db.c1.dropIndex('name_1')
给name创建索引并起名webopenfather
1
db.c1.createIndex({name:1},{name:'webopenfather'})
创建复合/组合索引
给name和age添加组合索引
1
db.c1.createIndex({name:1,age:1})
创建唯一索引
1
db.c1.createIndex(待添加索引的列,{unique:列名})
分析索引(explain)
1 | 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’)
选择规则
为常做条件、排序、分组的字段建立索引
选择唯一性索引
同值较少如性别字段
选择较小的数据列,为较长的字符串使用前缀索引
索引文件更小
MongoDB权限机制
1 | db.createUser({ |
角色种类 | 说明 |
---|---|
超级用户角色 | root |
数据库用户角色 | read 、readWrite |
数据库管理角色 | dbAdmin 、userAdmin |
集群管理角色 | clusterAdmin 、clusterManager 、clusterMonitor 、hostManager |
备份恢复角色 | backup 、restore |
所有数据库角色 | readAnyDatabase 、readWriteAnyDatabase 、userAdminAnyDatabase 、dbAdminAnyDatabase |
角色 | 角色说明 |
---|---|
root | 只在admin数据库中可用。超级账号,超级权限; |
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile; |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
开启验证模式
添加超级管理员
1
2
3
4
5
6
7
8
9use admin
db.createUser({
"user" : "root",
"pwd": "root",
"roles" : [{
role: "root",
db: "admin"
}]
})退出卸载服务
需要使用管理员模式打开终端
1
mongod --remove
重新安装需要输入账号密码的服务
在原安装命令基础上加
--auth
即可1
mongod --install --dbpath F:\MongoDB\data --logpath F:\MongoDB\logs\mongoDB2.log --auth
启动服务
1
net start mongodb
通过超级管理员账号登陆
第一种方式
1
mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
第二种方式
- 先登录
- 选择数据库
- 输入
db.auth(用户名,密码)
实例练习
准备数据
1 | use shop; |
添加用户并设置权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20use shop
// 只能读
db.createUser({
"user" : "shop1",
"pwd": "shop1",
"roles" : [{
role: "read",
db: "shop"
}]
})
// 只能写
db.createUser({
"user" : "shop2",
"pwd": "shop2",
"roles" : [{
role: "readWrite",
db: "shop"
}]
})
备份还原
备份
1 | mongodump -h -port -u -p -d -o |
- -h表示服务器IP地址(不写默认本机)
- -port表示端口(默认27017)
- -u表示账号
- -p表示密码
- -d表示数据库(数据库不写则导出全部)
- -o备份到指定目录ia
备份所有数据到
F:\MongoDB\back
1
mongodump -u root -p root -o F:\MongoDB\back
备份指定数据到
F:\MongoDB\back1
1
mongodump -u shop2 -p shop2 -d shop -o F:\MongoDB\back1
因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。
还原数据
1 | mongorestore -h -port -u -p --drop -d |
- -d 不写则还原全部数据
- –drop表示先删除在导出,不写则覆盖
还原所有数据
1
mongorestore -u root -p root --drop F:\MongoDB\back
备份指定数据库
备份指定数据库,不能使用root账户,需要使用有写权限的账户。且需要指定具体文件名。
1
mongorestore -u shop2 -p shop2 -d shop --drop F:\MongoDB\back1\shop
可视化工具
安装
使用
创建链接
授权
此时可以看到所有数据库
对于可视化工具,我个人更喜欢Navicat