MongoDB数据库
安装
创建服务:
bin/mongod.exe --install --dbpath 磁盘 路径 --logpath 日志路径
注意: 通过管理员身份运行DOS窗口 否则没有权限创建失败
删除服务
bin/mongod.exe --remove
启动服务:
net start mongodb
登录(验证是否安装成功)
关闭服务:
net stop mongodb
基本操作
查看数据库
语法:show databases
选择数据库
语法: use 数据库名称
查看集合
语法: show collections
创建集合
语法: db.collection
效果:
删除集合
语法:db.集合名.drop()
如何删除数据库?
1,通过 use 语法选择数据库, 2,通过 db.dropDatabase()
删除数据库
小总结
数据库(查看,创建,选择,删除
查看: show databases 创建: 有单独的语法, 但是经常通过隐式创建 选择: use 数据库名 删除: 1.通过 use 语法选中数据库,2, 通过 db.dropDatabase() 删除数据库
集合
查看: show collections 创建: db.createCollection('集合名') 删除: db.集合名.drop()
文档增删改查
增
语法: db.集合名.insert(JSON数据)
说明: 集合存在 则直接插入数据, 集合不存在,隐式创建
练习: 在 test2 数据库的c1集合中插入数据(姓名 webopenfather年龄18岁)
use test2 db.c1.insert({uname: "webopenfather", age:18}) 注意: 数据库和集合不存在 都为隐式创建 对象的键统一不加引号方便看, 但是查看集合数据时系统会自动增加
是否可以自定义_id值?
只需给插入的JSON数据增加_id键即可覆盖(但是不推荐)
db.c1.insert({id_:1, uname: "webopenfather", age: 18})
如何插入多条记录
传递数组,数组中写入一个个 JSON数据即可
db.c1.insert([ {uname: "z2", age:3}, {uname: "z3", age:4}, {uname: "z4", age:5} ])
如何快速插入10条数据
mongodb底层使用JS引擎实现的, 所以支持部分js语法
因此: 可以写 for 循环
在 test2数据库c2集合插入10条数据,分别为 a1, a2, a3,,,a10 use test2 for(let i = 0; i <= 10; i++) { db.c2.insert({uname: "a"+i, age:i}) }
查
基础语法: db.集合名.find(条件[, 查询的列])
条件 查询所有的数据 {}或者不写 查询age=6的数据 {age:6} 既要age=6又要性别=男 {age:6, sex: '男'} 查询的列 (可选参数) 不写 - 查询全部列(字段) {age:1} 只显示age列 {age:0} 除了age列(字段都显示) 不论你怎么写,系统自定义的_id都会显示
升级语法:
db.集合名.find({ 键: {运算符:值} })
运算符 | 作用 |
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
查询age=5,8,10的数据
改
基础语法: db.集合名.update (条件, 新数据 [, 是否新增, 是否修改多条])
是否新增: 指条件匹配不到数据则插入(true是插入, false是不插入默认) 是否修改多条: 指将匹配成功的数据修改(true是, false否)
升级语法
db.集合名.update (条件, 新数据) {修改器: {键:值}}
修改器 | 作用 |
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
案例:
将{uname:“xy1”}改为{uname: “xy2”}
使用基础语法修改数据,新数据会把旧数据替换
将 {uname:“xy3”}改为 {uname: “xy33”}
db.c3.update({uname: "xy3"},{$set: {uname: "xy33"}})
将 {uname: “xy10”}的age增加两岁,
db.c3.update({uname:"xy10"}, {$inc: {age: 2}})
如何一次性写入多个修改器?(用逗号隔开)
db.c3.update({uname: "小雨"}, { $rename: {who: "identify"}, $unset: {other: true} })
删
语法: db.集合名.remove(条件 [, 是否删除一条])
是否删除一条: 默认为false (删除匹配到的所有数据)
排序
语法: db.集合名.find().sort(JSON数据)
说明: 键 就是要排序的列/字段, 值: 1升序 -1降序
练习: 年龄升序&降序
db.c1.find().sort({age: -1})
降序
db.c1.find().sort({age: 1})
升序
limit与skip方法
语法: db.集合名.find().sort().skip(数字).limit(数字)
说明: skip跳过指定数量 (可选), limit限制查询的数量
练习: 1,降序查询查询2条 2, 降序跳过两条并查询两条
分页
需求: 数据库 1-10条数据, 每页显示两条
语法: db.集合名.find().skip().limit(2)
skip计算公式: (当前页 - 1) * 每页显示条数
.count() 统计总数量
聚合查询
如何统计数据,如何实现分组统计
语法
db.集合名称.aggregate([ {管道:{表达式}} ... ])
常用管道
$group 将集合中的文档分组, 用于统计结果 $match 过滤数据, 只需输出符合条件的文档 $sort 聚合数据进一步排序 $skip 跳过指定文档数 $limit 限制集合数据返回文档数 ...
常用表达式
$sum 总和 $sum:1同count表示统计 $avg 平均 $min 最小值 $max 最大值 ...
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降序 例{age:1}表示创建age索引并按照升序的方式储存
额外选项: 设置索引的名称或者唯一索引等等
删除索引语法:
全部删除: db.集合名.dropIndexes()
删除指定: db.集合名.droupIndex(索引名)
查看索引语法:
db.集合名.getIndexes()
给name添加普通索引, db.c1.createIndex({name:1})
给name添加索引,名字为web, db.c1.createIndex({name:1},{name:web})
创建复合/组合索引
一次性给两个字段添加索引
db.集合名.createIndex({键1:方式,键2:方式})
创建唯一索引
db.集合名.createIndex(带添加索引的列, {unique: true})
分析索引
- db.集合名.find().explain(‘executionStats’)
- 说明
实例: { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "test.tb3", "indexFilterSet" : false, "parsedQuery" : { }, "winningPlan" : { "stage" : "COLLSCAN", "direction" : "forward" }, "rejectedPlans" : [ ] }, "executionStats" : { // 执行计划相关统计信息 "executionSuccess" : true, // 执行成功的状态 "nReturned" : 3, // 返回结果集数量 "executionTimeMillis" : 0, // 执行所需的时间,毫秒 "totalKeysExamined" : 0, // 索引检查的时间 "totalDocsExamined" : 3, // 查询文档总数 "executionStages" : { "stage" : "COLLSCAN", // 索引扫描方式(COLLSCAN 全表扫描;IXSCAN 索引扫描; FETCH 根据索引去检索指定document) "nReturned" : 3, // 返回结果集数量 "executionTimeMillisEstimate" : 0, // 预估的执行时间,毫秒 "works" : 5, // 工作单元数,一个查询会被派生为一些小的工作单元 "advanced" : 3, // 优先返回的结果数量 "needTime" : 1, "needYield" : 0, "saveState" : 0, "restoreState" : 0, "isEOF" : 1, "direction" : "forward", // 方向 "docsExamined" : 3 // 文档检查数量 } }, "serverInfo" : { "host" : "e8797fbe90f9", "port" : 27017, "version" : "4.4.2", "gitVersion" : "15e73dc5738d2278b688f8929aee605fe4279b0e" }, "ok" : 1 }
索引扫描方式:
COLLSCAN 全表扫描
IXSCAN 索引扫描
FETCH 根据索引去检索指定document
选择规则(如何选择合适的列创建索引)
- 为常做条件,排序,分组的字段建立索引
- 选择唯一性索引
- 选择较小的数据列, 为较长的字符串使用前缀索引
MongoDB权限机制
开启验证模式
// mongodb数据库角色 1、数据库用户角色: read、readWrite 2、数据库管理角色:dbAdmin、dbOwner、userAdmin 3、集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager 4、备份恢复角色:backup、restore 5、所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6、超级用户角色:root 7、内部角色:__system 8、内建的角色 角色说明: read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 root:只在admin数据库中可用。超级账号,超级权限
概念:
用户需要输入账号密码才能登录使用
操作步骤:
- 添加超级管理员
- 退出卸载服务
- 重新安装需要输入账号密码的服务 (注: 在原安装命令基础上加上–auth即可)
- 启动服务 -> 登录测试
添加超级管理员
mongo
use admin db.createUser({ "user": "admin", "pwd": "admin888", "roles": [{ role: "root",//root 代表超級管理员权限 db: "admin" //admin代表给admin数据库加的超级管理员 }] })
db.system.users.find().pretty()
格式化查看
退出卸载服务
mongod --remove
注意:
- 以管理员的身份卸载
- 切换到 bin 目录下
安装需要身份验证的MongoDB服务
bin\mongod --install --dbpath E:\mongdb\data --logpath E:\mongodb\logs\mongodb2.log --auth
启动服务
法一:
mongo localhost:27017/admin -u admin -p admin888
mongo 127.0.0.1:27017/admin -u admin -p admin888
法二: 先登录,选择数据库,输入db.auth(用户名,密码)
练习:
- 需求
添加用户shop1可以读shop数据库
添加用户shop2可以读写shop数据库
注意: 必须在对应数据库创建用户
use shop ## shop1 db.createUser({ "user": "shop1", "pwd": "admin888", "roles": [{ role: "read", db: "shop" }] }) ## shop2 db.createUser({ "user": "shop2", "pwd": "admin888", "roles": [{ role: "readWrite", db: "shop" }] })
备份数据库mongoudmp
- 语法
导出数据语法: mongodump -h -port -u -p -d -o 导出语法说明: -h host 服务器IP地址 (一般不写 默认本机) -port 端口(一般不写 默认27017) -u user 账号 -p pwd 密码 -d database 数据库(留心: 数据库不写则导出全局) -o open 备份到指定目录
- 练习(备份所有数据)
mongodump -u admin -p admin888 -o E:\mongodb\bak
- 练习:(备份指定数据)
mongodump -u shop1 -p admin888 -d shop -o E:\mongodb\bak2
还原数据库mongorestore
- 语法
还原数据语法: mongorestore -h port -u -p -d–drop 备份数据目录
还原语法说明:
-h host 服务器IP地址 (一般不写 默认本机)
-port 端口(一般不写 默认27017)
-u user 账号
-p pwd 密码
-d database 数据库(留心: 数据库不写则还原全部)
–drop 先删除数据库在导入
- 练习
还原所有数据库
mongorestore -u admin -p admin888 --drop E:\mongodb\bak
还原指定数据库
mongorestore -u shop2 -p admin888 -d shop --drop E:\mongodb\bak2\shop
实战可视化管理工具
使用robot3T