1 知识回顾
关系数据库中几个名词,database, table, row ,column,index ,对应到nosql mongo 中 database,collection,document,field,index, 所有除了不能join 外,大部分概念是一样的。存储的数据结构不一样。关系数据库对字段类型,数据格式有要求,mongo 可存储的数据结构多样化。 需要注意的是mongo 中的 id 构成。
Mongo ObjectId 规则
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
接下来的 3 个字节是机器标识码
紧接的两个字节由进程 id 组成 PID
最后三个字节是随机数
id 中包含了时间戳,所有可以通过id 来获取记录时间。
mongo 中插入数据后,系统会生成唯一主键id, 如果不想使用系统生成的id ,可以在插入文档数据时,增加_id 字段,安装自定义的策略进行。此时会采用自定义id。
2 数据库创建
传统关系数据库采用create database dbname, 而mongo 则使用 use , use dbname ,当 db 不存在时,则创建,存在时则切换到db. 因为mongo 默认连接使用的库是test 库.
可以使用 show dbs 或 db 进行查看数据库
需要注意的是,当创建一个库后,如果没有插入数据,则当前库是不显示的,看不到库的存在,在admin 库下,可以看到所有的库。
插入数据时报错,原因是采用了auth 方式,需要先给当前库建立用户。
此时需要退出,重新登录授权,否则不能进行操作。重新登录后,执行结果
此时当前库有了数据,查看dbs
当使用一个库时,如果切换到其他库,如果是有auth 认证的情况下,切换后,执行命令就会报权限问题。所有不同的库不能直接切换,需要重启登录,然后切换授权使用。如果没有授权,则执行命令不会就结果产生。以下错误就是切换admin 和demo2 库时发生的错误。
3 用户创建
创建用户的命令 $username,$password 当前访问库的用户和密码,$root 当前库的角色,$dbname ,当前用户角色作用哪个库。 mongo 中角色内置的,每个角色代表不同的访问权限。
db.createUser(
{
user:"$username",
pwd:"$password",
roles:[{role:"$root",db:"$dbname"}]
}
)
创建时如何知道有哪些角色呢,可以使用命令show roles
show roles
输出的内容就是内置的角色,创建用户时,可根据需要选择适合的角色进行创建。
{
"role" : "dbAdmin",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbOwner",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "enableSharding",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "read",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWrite",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdmin",
"db" : "demo2",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
> use admin
switched to db admin
> show roles
{
"role" : "__queryableBackup",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "__system",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "backup",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterManager",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "clusterMonitor",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbAdminAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "dbOwner",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "enableSharding",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "hostManager",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "read",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWrite",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "readWriteAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "restore",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "root",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
{
"role" : "userAdminAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
4 用户查询
每个库下可能创建了很多用户,怎么知道有哪些用户呢。
可以通过两种方式进行。
show users
或者
db.system.users.find()
5 用户修改
用户修改很简单采用 updateUser 方法进行。 第一个参数为用户名,第二个为内容,根据用户名修改其内容。
db.updateUser($username,{})
db.updateUser(
"demo01",
{
pwd:"demo01",
roles:[{role:"readWrite",db:"demo2"}]
}
)
6 用户删除
db.dropUser($username)
8 数据库删除
mongo 数据库没有修改,所有当前数据库创建有有问题,或者不需要时,可以删除,删除时,需要先切换到库,然后执行命令
1 切换库
use dbname
2 删库
db.dropDatabase()
总结 Mongo 不同的库需要不同的用户进行管理,每个业务库最少可以建立2个用户,一个是普通用户,一个是管理员用户,Mongo 建立用户是在库的基础上,admin 库比较特殊,可以给其他库创建不同用户角色,但是不能直接操作其他库。