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