#博学谷IT学习技术支持#
文章目录
MongoDB入门
1. 基础概念
在mongodb中是通过数据库、集合、文档的方式来管理数据,下边是mongodb与关系数据库的一些概念对比:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接(MongoDB不支持) | |
primary key | primary key | 主键,MongoDB自动在每个集合中添加_id的主键 |
1、一个mongodb实例可以创建多个数据库
2、一个数据库可以创建多个集合
3、一个集合可以包括多个文档。
2. 连接mongodb
mongodb的使用方式是客户服务器模式,即使用一个客户端连接mongodb数据库(服务端)。
使用studio3T连接
3. 数据库
1、查询数据库
show dbs 查询全部数据库
db 显示当前数据库
2、创建数据库
命令格式: use DATABASE_NAME
eg.use test02
有test02数据库则切换到此数据库,没有则创建。
注意:
新创建的数据库不显示,需要至少包括一个集合。
4. 集合
集合相当于关系数据库中的表,一个数据库可以创建多个集合,一个集合是将相同类型的文档管理起来。
- 创建集合
db.createCollection(name, options)
name: 新创建的集合名称
options: 创建参数
- 删除集合
db.collection.drop()
例子:
db.student.drop() 删除student集合
5. 文档
1. 插入文档
mongodb中文档的格式是json格式,下边就是一个文档,包括两个key:_id主键和name
插入命令
db.COLLECTION_NAME.insert(document)
eg.
db.student.insert({"name":"黑马","age":10})
注意:同一个集合中的文档的key可以不相同!但是建议设置为相同的。
2. 更新文档
- 替换文档
db.student.update({"name":"黑马"},{"name":"北京黑马","age":10})
$set
修改器
db.student.update({"name":"黑马"},{$set:{"name":"北京黑马","age":10}},{multi:true})
3. 删除文档
- 删除所有文档
db.student.remove({})
- 删除符合条件的文档
db.student.remove({"name":"黑马"})
4. 查询文档
- 查询全部
db.student.find()
- 查询符合条件的记录
db.student.find({"name":"黑马"})
- 投影查询
db.student.find({"name":"黑马"},{name:1,age:1,_id:0})
6. 用户
1. 创建用户
超级用户root
命令
use admin
db.createUser(
{
user:"root",
pwd:"123",
roles:[{role:"root",db:"admin"}]
}
)
# 检验,查看结果是否为1
db.auth("root","123")
内置角色如下
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、
dbAdminAnyDatabase - 超级用户角色:root
2. 认证登录
为了安全需要,Mongodb要打开认证开关,即用户连接Mongodb要进行认证,其中就可以通过账号密码方式进行认证
- 在mono.conf中设置 auth=true
- 重启Mongodb
- 使用账号和密码连接数据库
- mongo.exe连接
mongo.exe ‐u root ‐p 123 ‐‐authenticationDatabase admin
- Studio 3T连接
- 直接连,
./mongo ip:port -u "root" -p "xxx" --authenticationDatabase "admin"
- mongo.exe连接
3. 查询用户
show users
4. 删除用户
进入所在数据库
use cms
db.dropUser("test1")
5. 修改用户
use admin
db.updateUser("test1",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]})
6. 修改密码
use admin
db.changeUserPassword("test1","123")
7. 索引
1. 查看索引
db.zips.getIndexes();
2. 创建索引
1是升序;-1是降序
db.zips.createIndex({"pop":1})
createIndex() 接收可选参数
- unique 索引是否唯一,默认false
- sparse 稀疏字段,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false
- weights 权重 1-99999之间 表示该索引相对于其他索引字段的得分权重
- name 索引名称,不指定会默认生成
eg. db.blog.createIndex({"date":-1},{name:"date_expire",expireAfterSeconds:5})
3. 删除索引
db.zips.dropIndex("date_expire")
db.zips.dropIndexes()
4. 执行计划
db.zips.find({ "pop": { "$gt": 10000 } }).explain();
结果:
执行计划的查询方式:
COLLSCAN/全表扫描、IXSCAN/索引扫描、FETCH/根据索引去检索文档、SHARD_MERGE/合并分片结果、IDHACK/针对_id进行查询
复合索引
也是 最佳左前缀法则。
8. 慢查询
介绍
mongodb中为开启Profiling功能。收集有关MongoDB的写操作,游标,数据库命令等,可以在数据库级别开启该工具,也可以在实例级别开启。该工具会把收集到的所有都写入到system.profile集合中,该集合是一个capped collection。
- 用慢查询日志(system.profile)找到超过200ms的语句
- 然后再通过.explain()解析影响行数,分析为什么超过200ms
- 决定是不是需要添加索引
Profiling级别说明:
- 0 不开启,默认
- 1 采集慢查询的数据
- 2 采集全部数据
测试
进入数据库 use zips-db
查看慢查询状态 db.getProfilingStatus()
设置慢查询级别 db.setProfilingLevel(2)
如果只需要收集小于100ms的慢日志 db.setProfilingLevel(1,100)
关闭Profiling db.setProfilingLevel(0)
慢查询分析 db.system.profile.find()
关键参数:
如果nscanned数很大,或者接近记录总数(文档数),那么可能没有用到索引查询
2. mongodb集群
1. 概念
分为三种
- 最老的是主从集群,如一主两从,slave只负责备份数据,master宕机直接集群就完蛋了,详细部署参考 https://www.cnblogs.com/wsmrzx/p/11599027.html
- 副本集模式,在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况,详细部署参考 https://www.cnblogs.com/wsmrzx/p/11599039.html ,密码的配置参考https://www.jianshu.com/p/0c4fd634adfb
- 分片集群,后续填坑
2. 副本集部署
部分命令
./mongod --shutdown --dbpath /data/aimongo/primary/data/db
keyFile = /data/aimongo/mongodb/access.key
rs.initiate({"_id":"repl","members":[{"_id":1,"host":"192.168.200.201:27001"},{"_id":2,"host":"192.168.200.202:27001"}]})
rs.addArb("192.168.200.203:27001")
./mongo mongodb://192.168.200.202:27001/admin
db.createUser({user:'root',pwd:'root-123456',roles:[{"role":"root","db":"admin"}]})
db.auth("root","root-123456")
配置文件
# 数据文件的存放位置
dbpath = /data/aimongo/secondary/data/db
# 日志文件的存放位置
logpath = /data/aimongo/secondary/log/mongodb.log
# 监听的端口,默认为 27017
port = 27001
# 以守护进程的方式运行 MongoDB
fork = true
# 设置 replSet 名称
replSet = repl