Mongo Shell是MongoDB自带的数据库管理工具。云数据库MongoDB支持通过Mongo Shell管理数据库账号。本文介绍如何通过Mongo Shell创建和查询数据库账号。

前提条件

  1. 已创建云数据库MongoDB实例。不同类型实例的创建方法如下:
    说明 云数据库MongoDB已停止新购Serverless实例,您可以使用现存实例。
  2. 已通过Mongo Shell成功连接云数据库MongoDB实例。不同类型实例的连接方法如下:

注意事项

同一数据库的数据库账号不允许重复。

创建数据库账号

说明
  • 数据库账号创建后不支持在云数据库MongoDB控制台的账号管理页面查询。
  • 首次通过Mongo Shell创建数据库账号时,需要在admin数据库下对实例固有的root账号进行认证。
  1. 切换到admin数据库。
    use admin
    说明 该命令可以直接复制执行,无需修改。
  2. 认证root账号。
    语法:
    db.auth("root","password")

    参数说明:password为root账号的密码。

    示例:
    db.auth("root","123456Aa")
  3. 创建数据库账号。
    • 方式一:切换到目标数据库,创建数据库账号。

      在哪个数据库创建的数据库账号,该数据库账号就属于哪个数据库。您可以通过use database_name命令切换数据库,其中database_name为目标数据库的名称。

      语法:
      db.createUser({user: "user_name", pwd: "password", roles:[{role: "role_name", db: "role_database_name"}]})
      参数说明:
      参数 描述 示例值
      user_name 数据库账号的名称。

      若账号名称中包含:/?#[]@特殊字符,需要对特殊字符进行百分比编码。如何编码,请参见百分比编码

      test
      password 数据库账号的密码。 123456Aa
      role_name 授予数据库账号的角色。

      角色取值,请参见数据库账号的角色说明

      readAnyDatabase
      role_database_name 角色所属的数据库名称。

      例如,{role: "readAnyDatabase", db: "admin"}表示授予该账号admin数据库的readAnyDatabase角色,对所有数据库具有只读权限。

      admin

      示例:

      在admin数据库中,创建数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。
      db.createUser({user: "test", pwd: "123456Aa", roles:[{role: "readAnyDatabase", db: "admin"}]})
      创建成功的返回结果如下:
      Successfully added user: {
              "user" : "test",
              "roles" : [
                      {
                              "role" : "readAnyDatabase",
                              "db" : "admin"
                      }
              ]
      }
    • 方式二:无需切换数据库,创建数据库账号。
      您可以使用以下任意一种命令创建数据库账号。
      • 命令一:
        语法:
        db.getMongo().getDB("database_name").createUser({user: "user_name", pwd: "password", roles: [{role: "role_name", db: "role_database_name"}]})
        参数说明:
        参数 描述 示例值
        database_name 数据库账号所属的数据库名称。 admin
        user_name 数据库账号的名称。

        若账号名称中包含:/?#[]@特殊字符,需要对特殊字符进行百分比编码。如何编码,请参见百分比编码

        test
        password 数据库账号的密码。 123456Aa
        role_name 授予数据库账号的角色。

        角色取值,请参见数据库账号的角色说明

        readAnyDatabase
        role_database_name 角色所属的数据库名称。

        例如,{role: "readAnyDatabase", db: "admin"}表示授予该账号admin数据库的readAnyDatabase角色,对所有数据库具有只读权限。

        admin

        示例:

        创建属于admin数据库的数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。
        db.getMongo().getDB("admin").createUser({user: "test", pwd: "123456Aa", roles: [{role: "readAnyDatabase", db: "admin"}]})
        创建成功的返回结果如下:
        Successfully added user: {
                "user" : "test",
                "roles" : [
                        {
                                "role" : "readAnyDatabase",
                                "db" : "admin"
                        }
                ]
        }
      • 命令二:
        语法:
        db.getSiblingDB("database_name").createUser({user: "user_name", pwd: "password", roles: [{role: "role_name", db: "role_database_name"}]})
        参数说明:
        参数 描述 示例值
        database_name 数据库账号所属的数据库名称。 admin
        user_name 数据库账号的名称。

        若账号名称中包含:/?#[]@特殊字符,需要对特殊字符进行百分比编码。如何编码,请参见百分比编码

        test
        password 数据库账号的密码。 123456Aa
        role_name 授予数据库账号的角色。

        角色取值,请参见数据库账号的角色说明

        readAnyDatabase
        role_database_name 角色所属的数据库名称。

        例如,{role: "readAnyDatabase", db: "admin"}表示授予该账号admin数据库的readAnyDatabase角色,对所有数据库具有只读权限。

        admin

        示例:

        创建属于admin数据库的数据库账号test,密码为123456Aa,并授予test账号readAnyDatabase角色。
        db.getSiblingDB("admin").createUser({user: "test", pwd: "123456Aa", roles: [{role: "readAnyDatabase", db: "admin"}]})
        创建成功的返回结果如下:
        Successfully added user: {
                "user" : "test",
                "roles" : [
                        {
                                "role" : "readAnyDatabase",
                                "db" : "admin"
                        }
                ]
        }

查询数据库账号

查询云数据库MongoDB实例的所有数据库账号

在admin数据库执行如下命令:
db.getCollection("system.users").find()
说明 该命令可以直接复制执行,无需修改。
返回结果如下:
{ "_id" : "admin.root", "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "WeN7mJumlZKG2dvzLRDL*****", "storedKey" : "wfRUnCq55ajFwnYxf9MQJ0k****", "serverKey" : "tP70xGJ9PRZs01VSJF1YDrHg****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "5aIQ734c2Whg2pPwfg****/mpJulsd+33rE****", "storedKey" : "otMBwA2TTwoU****+dfwccnfPN14Dy5Oq6keYOl****", "serverKey" : "VCE****+aLkXGzCqRiaPfjnFG4WFiAOq0BKXxTo0****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7ll****/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }

查询目标数据库的所有数据库账号

说明 您可以通过use database_name命令切换数据库,其中database_name为目标数据库的名称。
  • 方式一:在目标数据库执行查询命令。
    show users
    说明 该命令可以直接复制执行,无需修改。
    返回结果如下:
    {
            "_id" : "admin.root",
            "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"),
            "user" : "root",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "root",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
    {
            "_id" : "admin.test",
            "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"),
            "user" : "test",
            "db" : "admin",
            "roles" : [
                    {
                            "role" : "readAnyDatabase",
                            "db" : "admin"
                    }
            ],
            "mechanisms" : [
                    "SCRAM-SHA-1",
                    "SCRAM-SHA-256"
            ]
    }
  • 方式二:在admin数据库执行查询命令。
    语法:
    db.getCollection("system.users").find({db: "database_name"})

    参数说明:database_name为目标数据库的名称。

    示例:
    db.getCollection("system.users").find({db: "admin"})
    返回结果如下:
    { "_id" : "admin.root", "userId" : UUID("b079b4c8-0e34-4e0d-90f9-75741414****"), "user" : "root", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "WeN7mJumlZKG2dvzLRDL*****", "storedKey" : "wfRUnCq55ajFwnYxf9MQJ0k****", "serverKey" : "tP70xGJ9PRZs01VSJF1YDrHg****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "5aIQ734c2Whg2pPwfg****/mpJulsd+33rE****", "storedKey" : "otMBwA2TTwoU****+dfwccnfPN14Dy5Oq6keYOl****", "serverKey" : "VCE****+aLkXGzCqRiaPfjnFG4WFiAOq0BKXxTo0****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
    { "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7ll****/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "readAnyDatabase", "db" : "admin" } ] }

查询目标数据库的单个数据库账号

说明 查询单个数据库账号的命令需在admin数据库执行。
语法:
db.getCollection("system.users").find({user: "user_name", db: "database_name"})
参数说明:
  • user_name:数据库账号的名称。
  • database_name:数据库账号所属的数据库名称。
示例:
db.getCollection("system.users").find({user: "test", db: "admin"})
返回结果如下:
{ "_id" : "admin.test", "userId" : UUID("769ea9a1-6224-470e-8162-19a62fa2****"), "user" : "test", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "8fyXsIUgs6aQmafhTDrS****", "storedKey" : "fJQFoKsl7llXdiU/4vFU4xQn****", "serverKey" : "Tf1zygJ****/3/P3UMM47rr8****" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "wcWRhs9VXEsmNWtd7ZD****+NbYXx8ugJ3p2****", "storedKey" : "A5GiH****/tf70hakRY3U3joho3GrtFWQ****/WX****", "serverKey" : "ryRAcj6zomYiHJqhA9ObvuYALc3ZZva8ImR7B89C****" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

数据库账号的角色说明

所属数据库 角色 角色说明
所有数据库 readOnly 对所属数据库的只读权限。
readWrite 对所属数据库的读写权限。
userAdmin 在所属数据库下创建账号和角色的权限。
dbAdmin 在所属数据库下管理数据集合的权限。
dbOwner 包含readWrite、userAdmin和dbAdmin的所有权限。
enableSharding 允许分片集群实例的数据库在多个Shard节点上分布。
admin数据库 readAnyDatabase 对所有数据库的只读权限。
readWriteAnyDatabase 对所有数据库的读写权限。
userAdminAnyDatabase 在所有数据库下创建账号和角色的权限。
dbAdminAnyDatabase 在所有数据库下管理数据集合的权限。
clusterMonitor 执行各种采集信息指令的权限。
hostManager 执行setParameter、killop、resync和killCursors等指令的权限。更多指令信息,请参见hostManager
clusterManager 执行节点管理指令的权限。
clusterAdmin 包含clusterMonitor、hostManager和clusterManager的所有权限。
root 包含admin数据库下的所有权限,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase和dbAdminAnyDatabase等。
说明 角色说明的更多信息,请参见Built-In RolesMongoDB

相关文档