认识mongodb
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- MongoDB中将数据存储为一个文档,文档由键值对(key=>value)组成,MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
docker 安装mongodb
拉取最新版本的MongoDB镜像
docker pull mongo:latest
创建并运行一个MongoDB容器
docker run -itd --name mongo-test -p 27017:27017 mongo --auth
参数说明:
- **-itd:**其中,i是交互式操作,t是一个终端,d指的是在后台运行。
- **–name mongo-test:**容器名称
- -p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
- –auth:需要密码才能访问容器服务(注意:安全问题,MongoDB默认是不开启权限验证的,不过设置了这里就相当于修改MongoDB的配置auth=ture启用权限访问)。
进入创建的MongoDB容器
docker exec -it mongo-test mongosh
MongoDB报错"ongoServerError: not authorized on admin to execute command"
MongoDB默认是不需要用户密码就可以连接的,如果使用命令报错"ongoServerError: not authorized on admin to execute command ",则表示当前登陆用户不具备相应权限。
解决办法:在admin数据库中通过创建一个用户,赋予用户root权限。
# 进入admin数据库
use admin
# 创建一个超级用户
db.createUser(
{
user:"root",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
}
);#授权登录
db.auth('root','123456')
MongoDB用户权限管理
MongoDB添加用户命令说明
- user字段,为新用户的名字。
- pwd字段,用户的密码。
- cusomData字段,为任意内容,例如可以为用户全名介绍。
- roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在roles字段,可以指定内置角色和用户定义的角色。
- 超级用户的role有两种,userAdmin或者userAdminAnyDatabase(比前一种多加了对所有数据库的访问,仅仅是访问而已)。
- db是指定数据库的名字,admin是管理数据库。
- 不能用admin数据库中的用户登录其他数据库。注:只能查看当前数据库中的用户,哪怕当前数据库admin数据库,也只能查看admin数据库中创建的用户。
首先切换到admin数据库中
# 进入admin数据库
use admin
创建admin超级管理员用户
db.createUser(
{ user: "admin",
customData:{description:"superuser"},
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
创建一个不受访问限制的超级用户
db.createUser(
{
user:"root",
pwd:"123456",
roles:[{role:"root",db:"admin"}]
}
);
创建一个业务数据库管理员用户
只负责某一个或几个数据库的増查改删
db.createUser({
user:"user001",
pwd:"123456",
customData:{
name:'jim',
email:'jim@qq.com',
age:18,
},
roles:[
{role:"readWrite",db:"db001"},
{role:"readWrite",db:"db002"},
'read'// 对其他数据库有只读权限,对db001、db002是读写权限
]
})
MongoDB数据库角色说明
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、4. clusterMonitor、hostManage;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色:__system
MongoDB中的role详解
- Read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
- root:只在admin数据库中可用。超级账号,超级权限
概念
- 和关系型数据库一样,MongoDB存在数据库的概念,一个MongoDB可以创建多个数据库。
- 多个键及其关联的值有序地放置在一起就是文档,文档时MongoDB中数据的基本单元,是MongoDB的核心概念,很类似关系数据库中的行(记录)。
- 集合就是一组文档的组合,集合可以被看作关系型数据库中的表。
| RDBMS(关系型数据库管理系统) | MongoDB |
|---|---|
| Database(数据库) | Database(数据库) |
| Table(表) | Collection(集合) |
| Record(记录) | Document(文档) |
数据类型
以下为 MongoDB 中常用的几种数据类型:
- String: 字符串,存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
- Integer: 整型数值,用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
- Boolean: 布尔值,用于存储布尔值(true/false)。
- Double: 双精度浮点值,用于存储浮点值。
- Min/Max keys: 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
- Array: 用于将数组或列表或多个值存储为一个键。
- Timestamp: 时间戳。记录文档修改或添加的具体时间。
- Object: 用于内嵌文档。
- Null: 用于创建空值。
- Symbol: 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
- Date: 日期时间,用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
- Object ID: 对象 ID,用于创建文档的 ID。
- Binary Data: 二进制数据,用于存储二进制数据。
- Code: 代码类型,用于在文档中存储 JavaScript 代码。
- Regular expression: 正则表达式类型,用于存储正则表达式。
判断id类型为objectId
db.collection.find({
"_id": {
"$type": "objectId" } });
库级操作
use DATABASE #切换/创建库
show dbs #查看所有数据库(空库不会显示)
db.dropDatabase() #删除当前数据库
db #查看当前所在库
#集合操作
db.createCollection(name, options) #创建集合 用引号引起来
show collections #查看当前数据库的集合
db.集合名称.drop() #删除集合
文档操作
插入
db.集合名称.insert(document)
#插入文档, 集合不存在会自动创建, 不能插入重复id的数
#_id 是12个字节十六进制数在一个集合的每个文档是唯一的。
db.student.insert({
name:'句号'})
db.student.insert({
name:'句号', age:18})
db.student.insert({
_id:1, name:'句号', age:18})
db.student.insert([
{
name:'juhao', sex:'男', age:18},
{
name:'nanbei', sex:'男', age:19},
{
name:'budong', sex:'男', age:20},
])
查询
db.集合名称.find() #查询所有
db.集合名称.find().pretty() #结构化显示
db.student.find({
name:'句号'}) where name = 'key'
db.student.find({
name:{
$ne:'句号'}}) where name != 'key'
db.student.find({
age:{
$gt:18}}) where age > 18
db.student.find({
age:{
$gte:18}}) where age => 18
db.student.find({
age:{
$lt:18}}) where age < 18
db.student.find({
age:{
$lte:18}}) where age <= 18
# 类似于SQL语句:Select * from col where likes>100 AND likes<200;
db.col.find({
likes : {
$lt :200, $gt : 100}})
#and逻辑,$and:默认可以不写
{
$and:[{
expression1}, {
expression1}, ...] }
#or逻辑
{
$or:[{
expression1}

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



