Mongo Shell是MongoDB自带的数据库管理工具。云数据库MongoDB支持通过Mongo Shell管理数据库账号。本文介绍如何通过Mongo Shell创建和查询数据库账号。
前提条件
已创建云数据库MongoDB实例。不同类型实例的创建方法如下:
说明云数据库MongoDB已停止新购Serverless实例,您可以使用现存实例。
已通过Mongo Shell成功连接云数据库MongoDB实例。不同类型实例的连接方法如下:
注意事项
同一数据库的数据库账号不允许重复。
创建数据库账号
数据库账号创建后不支持在云数据库MongoDB控制台的账号管理页面查询。
首次通过Mongo Shell创建数据库账号时,需要在admin数据库下对实例固有的root账号进行认证。
切换到admin数据库。
use admin
说明该命令可以直接复制执行,无需修改。
认证root账号。
语法:
db.auth("root","password")
参数说明:
password
为root账号的密码。示例:
db.auth("root","123456Aa")
创建数据库账号。
方式一:切换到目标数据库,创建数据库账号。
在哪个数据库创建的数据库账号,该数据库账号就属于哪个数据库。您可以通过
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等指令的权限。 | |
clusterManager | 执行节点管理指令的权限。 | |
clusterAdmin | 包含clusterMonitor、hostManager和clusterManager的所有权限。 | |
root | 包含admin数据库下的所有权限,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase和dbAdminAnyDatabase等。 |
角色说明的更多信息,请参见Built-In Roles。