MongoDB简介&开启登录认证

本文基于MongoDB4.2编写,主要包括MongoDB简介,聚合操作简介、模型简介和安全;最后介绍MongoDB开启权限认证

简介

MongoDB是一种易于扩展和部署的文档类型数据库;每条记录在MongoDB中用文档表示,其中文档结构类似于JSON,字段和值对的形式;此外每条文档都隶属于Collection,Collection类似于数据库中的表;此外MongoDB还支持View和请求式view。

文档字段结构
{
    name: "xiaoming",
    school: {
        name: "helloworld"
    },
    "friend":["xiaohua","zhaoshi"],
    "friendInfo":[{
        name: "xiaohua",
        age: 10
    },{
        name: "zhaoshi",
        age: 12
    }]
}
  1. 值为普通类型
  2. 值为一个文档
  3. 值为一个普通类型数组
  4. 值为一个文档类型数组
具有以下优势
  1. Mongo中文档的数据类型和很多语言原生类型相同
  2. 嵌套文档和数组减少了join操作,从而降低开销
  3. 支持动态结构
其他特性
  • 高性能:支持嵌套模型降低io;支持索引
  • 丰富查询语言:聚集查询、文本搜索、空间搜索
  • 高可用:自动故障转移和数据冗余
  • 水平扩展性:支持水平扩展
  • 支持多种存储引擎:事务存储引擎(文档级别并发使用乐观锁)、基于内存存储引擎和第三方存储引擎

聚合操作简介

聚合操作是通过关联多个文档数据经过一系列计算获得单个数据的一种计算操作;MongoDB提供三种计算方式:聚合管道、map-reduce函数和简单聚合函数。

聚合管道使用方式如下:

db.orders.aggregate([
   { $match: { status: "A" } },
   { $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])

匹配status为“A”的数据,根据cust_id字段分组,最后根据分组求每个分组中amout的和。

map-reduce和简单聚合函数请参考官网

文档结构简介

MongoDB的collections创建时默认是不需要指定结构,即MongoDB的表结构是动态可变的;文档结构可分为两种:嵌套结构和引用结构;此外文档原子性写操作中,单文档支持原子性,多文档不支持(4.2以后支持);最后MongoDB3.2开始支持文档格式校验。以下将主要介绍文档格式校验和文档结构设计内容。

文档格式校验
  1. MongoDB3.2开始支持数据更新插入进行有效性校验;可以在创建时通过validator字段添加或创建后使用collMod修改

  2. MongoDB3.6开始支持JSON格式的验证语法,使用方法如下:

    db.createCollection("students", {
       validator: {
          $jsonSchema: {
             bsonType: "object",
             required: [ "name"],
             properties: {
                name: {
                   bsonType: "string",
                   description: "must be a string and is required"
                }       
             }
          }
       }
    })
    

    当加入上述验证后,写入数据时必须指定name字段,否则写入报错。

  3. 其他校验方式:使用查询表达式指定校验规则,设置方法如下:

    db.createCollection( "contacts",
       { validator: { $or:
          [
             { phone: { $type: "string" } },
             { email: { $regex: /@mongodb\.com$/ } },
             { status: { $in: [ "Unknown", "Incomplete" ] } }
          ]
       }
    } )
    

​ 更多表达式可参考官网

文档结构选择建议
  1. 如果数据为一对一或一对多,通常情况使用嵌套数据模型;
  2. 如果数据为多对多、重复并不能带来高的读取性能情况下使用常规数据模型(描述关系使用引用);

安全

支持TLS/SSL通信加密;数据安全基于角色赋权;用户安全基于SCRAMx.509实现认证;以下主要介绍角色相关内容

角色简介

MongoDB通过角色来控制用户操作权限和访问权限,MongoDB支持用户自定义角色和使用系统内置角色;以下将介绍内置角色,自定义角色请移步官网

内置角色
数据库用户角色

read:允许在授权db的所有表上进行读操作

readWrite:允许在授权db的所有表上进行读和写操作

使用方法如下

use admin
//创建用户时指定角色
db.createUser(
  {
    user: "test",
    pwd: "password", 
    roles: [ { role: "read", db: "admin" },{ role: "readWrite", db: "admin" }]
  }
)

//创建用户后添加角色
db.grantRolesToUser(
    "test",
    [
      { role: "read", db: "admin" }
    ]
)

//移除角色
db.revokeRolesFromUser(
    "test",
    [
      { role: "readWrite", db: "admin" }
    ]
)

//查看用户信息
db.getUser("test")
数据库管理员角色

dbAdmin:允许在授权db执行结构相关任务、索引任务和聚集统计任务,该角色没有用户和角色管理能力

dbOwner:包含readWrite、dbAdmin和userAdmin权限

userAdmin:允许在授权db上进行创建修改角色或用户;由于userAdmin允许授予用户任何权限给任何角色,因此如果用户拥有admin的userAdmin角色,即拥有最高权限

使用方法如下

use admin
//创建用户时指定角色
db.createUser(
  {
    user: "test",
    pwd: "password", 
    roles: [ { role: "dbOwner", db: "admin" }]
  }
)
所有库角色

以下角色将获得所有db的相关权限,除了local和config这两个db。

readAnyDatabase:该角色能读取任何db的collection

readWriteAnyDatabase:该角色能读写任何db的collection

userAdminAnyDatabase:该角色在任何db上都拥有userAdmin权限

dbAdminAnyDatabase:该角色在任何db上都拥有dbAdmin权限

使用方法如下

use admin
//创建用户时指定角色
db.createUser(
  {
    user: "test",
    pwd: "password", 
    roles: [ "readWriteAnyDatabase","userAdminAnyDatabase"]
  }
)

//创建用户后添加角色
db.grantRolesToUser(
    "test",
    [
      "readWriteAnyDatabase"
    ]
)

//移除角色
db.revokeRolesFromUser(
    "test",
    [
      "readWriteAnyDatabase"
    ]
)
超级权限

MongoDB内置有一个超级权限角色root,该角色是这些角色dbOwner、userAdmin、userAdminAnyDataBase、clusterAdmin、restore和backup的合并版

使用方法如下

use admin
db.createUser(
  {
    user: "root",
    pwd: "123456",  
      roles: [
       "root"
    ]
  }
)
其他

更多角色信息,例如:集群管理角色、备份修复角色请移步官网

开启MongoDB登录权限验证

创建用户
mongo
use admin
//创建root用户并授予超级权限
db.createUser(
  {
    user: "root",
    pwd: "password",  
      roles: [
       "root"
    ]
  }
)

//查看创建的用户信息
db.getUser("root") 

//关闭mongo
db.adminCommand( { shutdown: 1 } )
修改配置&重启MongoDB

方式一

在启动命令行中加入--auth开启权限认证

mongod --auth --port 27017 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log

方式二

在配置文件中(默认:/etc/mongod.conf)添加如下信息,然后重启(mongod --config /etc/mongod.conf):

security:
    authorization: enabled
登录MongoDB

第一种登录方式

mongo -u root -p --authenticationDatabase “admin”

第二种登录方式

mongo 
use admin
db.auth("root","password")

Q&A

  1. 如何创建库区?

    MongoDB无需创建库区,直接使用;在命令行直接使用use 库区名称即可。

参考链接

https://www.mongodb.com/docs/v4.2/introduction/

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐