day05-mongodb学习
mongo容器进入
//生成启动容器
docker run -itd --name mongo -p 27017:27017 mongo
//进入容器---下面两个都可以
docker exec -it mongo /bin/bash
docker exec -it mongo admin //有账户密码admin,123456
redis容器进入方法
//生成启动容器
docker run -itd --name redis -p 27017:27017 redis
//进入容器----下面两个都可以
docker exec -it redis /bin/bash
docker exec -it redis的id /bin/bash
mysql一样方法进入
//安装mysql
docker pull mysql
//生成启动容器,并设置密码
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql
//进入容器----下面两个都可以
docker exec -it mysql /bin/bash
docker exec -it mysql的id /bin/bash
//进入mysql后,通过账号密码进入
>mysql -h localhost -u root -p
>Enter password:
>show databases; //展示所有数据库
>use databasesName; //切换数据库
>show tables; //展示所有表
>show columns from tableName;//展示表创建信息
>select * from tableName; //查询表中所有信息
在git bash
里面启动的话
使用docker exec -it mysql /bin/bash会报错
the input device is not a TTY. If you are using mintty, try prefixing the command with 'winpty'
//这个命令才可以
winpty docker exec -it mysql bash
nodejs中使用MySQL连不上报错:
Unhandled rejection SequelizeConnectionError: Client does not support authentication protocol requested by server; consider upgrading MySQL client
解决办法:
//1、查看用户信息
select host,user,plugin,authentication_string from mysql.user;
//2、修改用户密码
//更新user为root,host为% 的密码为123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
//更新user为root,host为localhost 的密码为123456
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
//刷新权限
FLUSH PRIVILEGES;
-----------------------------------------------分割线-----------------------------------------------------------
表就是关系(表与表之间存在的关系)
- 所有的关系型数据库都需要通过sql语言操作
- 所有的关系型数据库在操作之前都需要设计表结构
- 数据表还支持约束
- 唯一的
- 主键
- 默认值
- 非空
- 非关系型数据库非常的灵活
- 有的非关系型数据库就是key-value(键值对)
- mongodb是长的最像关系型数据库的非关系型数据库
- mongodb不需要设计表结构
- 可以任意往里面存数据,没有结构这一说
基本使用:
nodeJs中
npm i mongoose
启动MongoDb镜像
# 拉取官方镜像
docker pull mongo
# 启动mongo镜像
docker run -itd --name mongo -p 27017:27017 mongo
★ -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
★ --name :起别名
# 启动/暂停容器
docker start/stop mongo
# 查看mongo进程
docker ps -a
进入容器并启动mongo,如下
# 1.登录到 MongoDB 容器中
docker exec -it (容器CONTAINER ID) mongo admin
# 添加管理员账号
db.createUser( {user: "admin",pwd: "密码",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
# 进行验证
db.auth("admin","密码");
# 一些命令:
show dbs (或者使用show databases 查看当前数据库情况,默认在test下)
db dbname (查看当前连接在哪个数据库)
db.site.insert({"name":"test"}) (创建数据库)
db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]}) (创建用户)
db admin
db.auth("admin", "123456") (切换用户)
添加管理用户
db.createUser( {user: "admin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
具体角色:
- Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限。
刚建立了 userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户
添加普通数据库用户
db.createUser({ user:"temp",pwd:"123",roles:[{ role: "readWrite",db:"test"}]})
事实是,MongoDB的用户权限和数据库是绑定的。也就是创建一个新的数据库,并在数据库中插入数据的正确操作应该是需要创建与之对应的用户,下面退出MongoDB命令行模式,重新进入:
1. 输入`use admin`,进入admin数据库,root用户需要在admin数据库中认证。
2. 输入db.auth('root','root')超级用户进行认证
3. 输入db.createUser({user: "temp",pwd: "123456",roles: [ { role: "readWrite", db: "test" } ]} )创建temp用户,并为它指定数据库为test。
4. 输入db.auth('okevin','123456')切换认证用户。
5. 输入use recommended切换至recommended数据库
6. 输入db.repo.insert({"name":"kevin"}),创建一条数据
这才是创建一个数据库,并插入一条数据库的正确姿势,并且一定记住几点:
数据库和用户是绑定的,光创建一个超级用户并不能操作在其他新建的数据库中插入数据
在切换数据库时,先切换认证用户,不然会出现too many users are authenticated的错误。
参考博客: