排序&分页
准备数据
代码语言:javascript复制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()
排序
代码语言:javascript复制db.集合名.find().sort(JSON数据)
Limit与Skip方法
代码语言:javascript复制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)* 每页显示条数
聚合查询
代码语言:javascript复制db.聚合名称.aggregate([
{管道:{表达式}}
....
])
常用管道 | 说明 |
---|---|
$group | 将集合中的文档分组,用于统计结果 |
$match | 过滤数据,只要输出符合条件的文档 |
$sort | 聚合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
常用表达式 | 说明 |
---|---|
$sum | 总和 $sum:1同count表示统计 |
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
实例练习
准备数据
代码语言:javascript复制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
键表示按哪一个字段分组,需要显示的列新增字段即可。
- 统计男生、女生的总年龄12345678db.c1.aggregate([ { group:{ _id:"sum:"
- 统计男生、女生的总人数12345678db.c1.aggregate([ { group:{ _id:"
- 求学生总数和平均年龄123456789db.c1.aggregate([{ group:{ _id:null, total_num:{sum:1}, total_avg:{avg:"
- 查询男生、女生人数,按人数升序1234567891011db.c1.aggregate([ { group:{ _id:"sum:1} } }, { sort:{rs:1} }])
索引
创建索引
代码语言:javascript复制db.集合名.createIndex(带创建索引的列[,额外选项])
- 带创建索引的列:{键:1,键:-1} 1表示升序,-1表示降序
- 额外选项 设置索引的名称或者唯一索引等等
删除索引
- 全部删除 db.集合名.dropIndexes()
- 删除指定 db.集合名.dropIndex(索引名)
查看索引语法
代码语言:javascript复制db.集合名.getIndexes()
实例练习
数据准备
代码语言:javascript复制//选择数据库
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)
代码语言:javascript复制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权限机制
代码语言:javascript复制db.createUser({
"user" : "账号",
"pwd": "密码",
"roles" : [{
role: "角色",
db: "所属数据库"
}]
})
角色种类 | 说明 |
---|---|
超级用户角色 | 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数据库中可用,赋予用户所有数据库的读写权限 |
开启验证模式
- 添加超级管理员 use admin db.createUser({ "user" : "root", "pwd": "root", "roles" : [{ role: "root", db: "admin" }] })
- 退出卸载服务 需要使用管理员模式打开终端 mongod --remove
- 重新安装需要输入账号密码的服务
在原安装命令基础上加
--auth
即可 mongod --install --dbpath F:MongoDBdata --logpath F:MongoDBlogsmongoDB2.log --auth
- 启动服务 net start mongodb
通过超级管理员账号登陆
- 第一种方式 mongo 服务器IP地址:端口/数据库 -u 用户名 -p 密码
- 第二种方式
- 先登录
- 选择数据库
- 输入
db.auth(用户名,密码)
实例练习
准备数据
代码语言:javascript复制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" }] })
备份还原
备份
代码语言:javascript复制mongodump -h -port -u -p -d -o
- -h表示服务器IP地址(不写默认本机)
- -port表示端口(默认27017)
- -u表示账号
- -p表示密码
- -d表示数据库(数据库不写则导出全部)
- -o备份到指定目录ia
- 备份所有数据到
F:MongoDBback
mongodump -u root -p root -o F:MongoDBback
- 备份指定数据到
F:MongoDBback1
mongodump -u shop2 -p shop2 -d shop -o F:MongoDBback1因为数据库是属于shop1与shop2的,因此导出需要使用这两个账号。
还原数据
代码语言:javascript复制mongorestore -h -port -u -p --drop -d
- -d 不写则还原全部数据
- –drop表示先删除在导出,不写则覆盖
- 还原所有数据
mongorestore -u root -p root --drop F:MongoDBback
- 备份指定数据库 备份指定数据库,不能使用root账户,需要使用有写权限的账户。且需要指定具体文件名。 mongorestore -u shop2 -p shop2 -d shop --drop F:MongoDBback1shop
可视化工具
Robo 3T
安装
使用
- 创建链接
- 授权
- 此时可以看到所有数据库
对于可视化工具,我个人更喜欢Navicat