之前在多系统安装 MongoDB一文中,在创建 docker-compose.yml 文件时,创建了 root 管理员的用户名和密码。由于 root 用户权限非常高,通常这个密码是不透露出去的,一般只交给数据库的维护人员去使用到的一个超级管理员密码。因此,需为单个数据库添加管理用户。

一、MongoDB内置角色

MongoDB 为数据库系统不同级别的访问需求提供了内置的角色,每个数据库都存在内置的数据库用户角色数据库管理员角色,admin数据库还包含额外的角色。

这里简单的介绍一下内置的角色,更多见官方链接

1.1 数据库用户角色

每个数据库都包含下列的角色:

  • read: 提供读取所有的非系统集合的能力,也能读取以下系统集合:system.indexes、system.js、system.namespaces;
  • readWrite: 提供所有读权限,另外还能修改非系统集合和system.js集合;

1.2 数据库管理员角色

每个数据库都包含以下数据库管理员角色:

  • dbAdmin: 提供执行管理任务的能力,比如schema相关的任务,索引和聚合分析。这个角色不能对用户和角色做授权管理;
  • dbOwner: 数据库拥有者可以在数据库上执行任何管理动作,这个角色组合了readWrite、dbAdmin、userAdmin角色的特权(一般来说,新建数据库时使用dbOwner这个角色就OK了);
  • userAdmin: 在当前数据库中创建和修改角色和用户的能力,userAdmin角色允许用户授予任何特权给任何用户,包括他们自己,此角色还可以直接提供 superuser 访问任何数据库,甚至是admin数据库、集群。

1.3 集群管理员角色

admin 数据库包括下列角色来管理整个系统而不仅仅是单个数据库,这些角色包括但不限于副本集和分片集群管理功能:

  • clusterAdmin:提供最大的机器管理访问权限,此角色组合了clusterManager、clusterMonitor和hostManager角色,另外此角色还提供dropDatabase动作;
  • clusterManager:在机器上能进行管理和监控动作。拥有此角色的用户可以访问config和local数据库,它们分别用于分片和副本集;
  • clusterMonitor:为监控工具提供只读权限,比如MongoDB cloud manager 和ops manager 监控代理;
  • hostManager:提供监控和管理服务器的能力

二、添加管理用户

2.1 链接数据库

在 Docker 环境下,连接数据库:

docker exec -it mongotest_mongo_1 mongo

其中:

  • mongotest_mongo_1 为当前mongoDB的容器名称;


注: 因为只是进入shell终端,所以不需要账号密码**。

切换到管理员的数据库:

use admin db.auth(‘root’, ‘example’)

此时在输入 show dbs,就可以查看到多个数据库。

2.2 为单个数据库添加管理用户

  1. 创建数据库 testdb

    use testdb

  1. 创建当前数据库的管理员用户(用户名和密码),并创建相应角色dbOwner。

    db.createUser({user: ‘Li’, pwd: ‘123456’, roles:[{role: ‘dbOwner’, db: ‘testdb’}]})

  • db保留关键词,代表当前数据库。role: 'dbOwner', db: 'testdb' 表示创建的用户在 testdb 数据库是属于什么角色,dbOwner表示数据库的所有者。
  1. 创建成功后,可以新开一个终端,使用db.auth进行鉴权登录。

    use testdb db.auth(‘Li’,’123456’)

注:如何为用户创建多个数据库权限?

  1. // 指定数据库
  2. use reporting
  3. db.createUser({
  4. user: "reportsUser",
  5. pwd: passwordPrompt(), // or cleartext password
  6. roles: [
  7. // 在reporting数据库中的角色是 read
  8. { role: "read", db: "reporting" },
  9. { role: "read", db: "products" },
  10. { role: "read", db: "sales" },
  11. { role: "readWrite", db: "accounts" }
  12. ]
  13. })

2.3 增删改查操作

针对刚才创建的用户,测试能否进行增删改查操作。更多增删改查操作,参照官网手册

2.3.1 插入单条数据

db.users.insertOne({name: ‘李二’, age: 30})

其中 users 表示collections(集合)。collections 在MongoDB中是非常重要的概念,相当于关系型数据库的Table(表格)。在MongoDB中,用户不需要显式定义Collection就能向Collection插入数据。

查看当前database中的collection列表:

show collections

2.3.2 查询所有结果

db.users.find({})

2.3.3 更新数据

db.users.updateOne({name: ‘李二’}, {$set: {age: 35}})

  • 第一个参数表示过滤条件
  • 第二个参数表示更新内容。使用$set操作符对age字段设置指定值;

2.3.4 删除文档

删除满足匹配条件的最多一个文档。

db.users.deleteOne({name: “李二”})