本文所述 MongoDB 版本为 4.0.5, 笔者对 MongoDB 刚接触, 对各个版本的 MongoDB 不甚了解, 本文不对该版本的 MongoDB 做特性介绍, 所涉及命令也许对其余版本不适用.
因为目前有一个试验性的项目想要使用 NoSQL, 而 MongoDB 在工作中有一定的接触, 所以这个项目打算使用 MongoDB, 而在真正从下载到安装到使用的时候发现了不少的知识点, 以此作为记录.
用户权限问题是遇到的第一个问题, 我从官网上找来 Mac os 环境的 MongoDB 的安装包, 照着几个网络博客创建了一个自定义的 mongod.conf 配置文件, 也不知道里面配置项是什么就通过命令 mongod --cofig mongod.conf 启动起来了跟着一步一步也算是启动起来了. 配置项如下:
- #MongoDB config file
- dbpath=/Users/reesemonica/MongoDB/data/db
- logpath=/Users/reesemonica/MongoDB/mongod.log
- logappend=true
- fork=true
- auth=true
这个配置项我只修改了数据文件的路径和日志路径.
结果一启动在并且进入 mongo 命令行模式中想通过 show dbs 来查看有哪些数据库就抛出了一个错误:
- Error: listDatabases failed:{
- "ok" : 0,
- "errmsg" : "command listDatabases requires authentication",
- "code" : 13,
- "codeName" : "Unauthorized"
- }
看这意思是说需要权限, 可我哪儿知道这个权限从哪儿来, 搜了一下问题, 结果是说 MongoDB 默认是可以不通过权限操作的, 结果我在自定义配置 mongod.conf 中配置了 auth=true, 也就是说我自己配置了需要权限操作.
权限就涉及到用户的创建, 而且需要创建一个 ** 超级用户 **, 找了一下命令:
- db.createUser(
- {
- user: "root",
- pwd: "root",
- roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
- } )
创建用户的命令的各个参数基本上通过参数名就知道是做什么的, 其中 roles.db 参数是指定用户的数据库, admin数据库虽不知道它具体做什么的, 但既然创建超级用户需要在这里, 想必就是存储一些用户信息的.
在创建好超级用户后, 此时还不能执行 show dbs 命令, 还需要做一次权限认证 db.auth('root','root'),返回 1表示认证成功, 此时再输入 show dbs 会回显以下:
- admin 0.000GB
- config 0.000GB
- local 0.000GB
这都是 MongoDB 默认的数据库, 我想自己创建一个数据库名字为 recommended, 执行, 如果 recommended 数据库不存在则会创建, 这并不是真正的创建, 而是只有当有数据插入时才会真正创建,再在 use recommened命令后执行 db.recommened.insert({"name":"kevin"}), 我本以为通过 root 这个 "超级用户" 就可以畅通无阻地在 MongoDB 中翱翔, 然而我错了, 又抛了错误:
- WriteCommandError({
- "ok" : 0,
- "errmsg" : "not authorized on recommended to execute command { insert: \"recommended\", ordered: true, lsid: { id: UUID(\"5b1b337e-831a-4fb2-b90c-d6d0b347ad79\") }, $db: \"recommended\"}",
- "code" : 13,
- "codeName" : "Unauthorized"
- })
这意思还是没有授权, 但我明明不是已经创建了一个超级用户了吗, MySQL 不就能通过一个超级用户畅通无阻吗.
事实是, MongoDB 的用户权限和数据库是绑定的. 也就是创建一个新的数据库, 并在数据库中插入数据的正确操作应该是需要创建与之对应的用户, 下面退出 MongoDB 命令行模式, 重新进入:
1. 输入 use admin, 进入 admin 数据库, root 用户需要在 admin 数据库中认证.
2. 输入 db.auth('root','root') 超级用户进行认证
3. 输入 db.createUser({user: "okevin",pwd: "123456",roles: [ { role: "readWrite", db: "recommended" } ]} ) 创建 okevin 用户, 并为它指定数据库为 recommended.
4. 输入 db.auth('okevin','123456') 切换认证用户.
5. 输入 use recommended 切换至 recommended 数据库
6. 输入 db.repo.insert({"name":"kevin"}), 创建一条数据.
这才是创建一个数据库, 并插入一条数据库的正确姿势, 并且一定记住几点:
数据库和用户是绑定的, 光创建一个超级用户并不能操作在其他新建的数据库中插入数据
在切换数据库时, 先切换认证用户, 不然会出现 too many users are authenticated 的错误.
以上是学习 MongoDB 所积累到的第一个知识点 ** 用户权限 **, 通过命令行模式不足以直观地展示数据, 可使用其他可视化工具对 MongoDB 进行操作, 例如 Robo 3T.
这是一个能给程序员加 buff 的公众号
来源: https://www.cnblogs.com/yulinfeng/p/10226977.html