mongodb基础篇

#博学谷IT学习技术支持#

MongoDB入门

1. 基础概念

在mongodb中是通过数据库、集合、文档的方式来管理数据,下边是mongodb与关系数据库的一些概念对比:

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接(MongoDB不支持)
primary keyprimary 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. 集合

集合相当于关系数据库中的表,一个数据库可以创建多个集合,一个集合是将相同类型的文档管理起来。

  1. 创建集合
db.createCollection(name, options)
name: 新创建的集合名称
options: 创建参数
  1. 删除集合
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. 更新文档
  1. 替换文档
db.student.update({"name":"黑马"},{"name":"北京黑马","age":10})
  1. $set修改器
db.student.update({"name":"黑马"},{$set:{"name":"北京黑马","age":10}},{multi:true})
3. 删除文档
  1. 删除所有文档
db.student.remove({})
  1. 删除符合条件的文档
db.student.remove({"name":"黑马"})
4. 查询文档
  1. 查询全部
db.student.find()
  1. 查询符合条件的记录
db.student.find({"name":"黑马"})
  1. 投影查询
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")

内置角色如下

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、
    dbAdminAnyDatabase
  6. 超级用户角色:root
2. 认证登录

为了安全需要,Mongodb要打开认证开关,即用户连接Mongodb要进行认证,其中就可以通过账号密码方式进行认证

  1. 在mono.conf中设置 auth=true
  2. 重启Mongodb
  3. 使用账号和密码连接数据库
    • mongo.exe连接 mongo.exe ‐u root ‐p 123 ‐‐authenticationDatabase admin
    • Studio 3T连接
    • 直接连,./mongo ip:port -u "root" -p "xxx" --authenticationDatabase "admin"
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。

  1. 用慢查询日志(system.profile)找到超过200ms的语句
  2. 然后再通过.explain()解析影响行数,分析为什么超过200ms
  3. 决定是不是需要添加索引

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值