Mongodb数据库入门系列(二)

这是mongodb数据库入门系列的第二篇文章,这篇主要是对mongodb数据库的查询功能添加索引优化查询速度、已经表关联关系的一些整理,还有补充一下数据库的用户权限设置。

1、数据库的数据索引

索引就是一个标记,作用就是加快查找速度,但是也会加大更新的速度,

我们给上篇文章中的admin多添加点数据,先加个几十万条(可能需要几分钟才能加进去),没看过的可以查看我的上一篇文章,查看查询执行的时间添加 explain('executionStats'); 例如: db.admin.find({ age: 52010 }).explain('executionStats')

我们可以看到查询耗时 "executionTimeMillis" : 271,  271 毫秒,假设我们经常使用 age 进行查询,那我们给 age 设置一个索引。

  • 查看表中索引:db.表名称.getIndexes() ;例如:db.admin.getIndexes() , 默认的我们表中只有一个 _id的默认索引。

  • 设置索引db.表名称.ensureIndex({ 设置索引的字段:1 }), 1升序 -1 降序;例如:db.admin.ensureIndex({ age: 1 })

此时我们在查看索引的时候就会发现有两个字段具有索引了:

再次查询查看查询时间:耗时直接变成了 0ms,可以看出来提升的速度很夸张。

  • 删除索引 db.表名称.dropIndex({ 索引字段: 1}) ;例如:  db.admin.dropIndex({ age: 1})
  • 复合索引:符合索引就是查询的时候需要几个字段一起查询,给这几个字段都设置索引,例如:admin 表中,我们给name、age设置索引 db.admin.ensureIndex({ name: 1, age: -1 }) 这个时候复合索引查询的机制就是,我们查找的时候按照name和age 一起找就会触发索引,我们按照 name (设置复合索引的时候的第一个字段)找也会触发索引,但是我们按照age找就不会(age在设置复合索引的时候不是第一个字段)。这里可以自己设置复合索引测试一下。触发索引explain中会有 indexBounds 字段。
  • 唯一索引: db.表名称.ensureIndex({ 索引字段: 1}, { unique: true }) 唯一索引就是我们我们给某个字段设置了唯一索引,那么这个字段在表中不能重复,例如:给admin中的name设置了唯一索引,db.admin.ensureIndex({ name: 1}, { unique: true }) 那么就代表插入的name必须能是表中不存在的,不能重名的意思,否则插入数据会duplicate key报错。

2、关系型数据库表关系

1、一对一关系:例如:一个人一个身份证号码;身份证和驾驶证;就是根据a可以找到b,根据b也可以找到a互相都是对应的;文章和文章内容等。

2、一对多关系    例如:商品的分类和对应的多个商品;一个部门多名员工,一个员工只能属于一个部门

3、多对多关系    例如:一个用户可以收藏多种商品,其中每一个商品也由多个用户进行收藏;

 

3、补充:Mongodb账户权限配置

如果我们现在没有配置账户权限,那么我们电脑的数据库谁都可以连接上(此时cmd直接输入mongo就可以连接),缺乏安全性,创建用户流程先用admin库创建超级管理员,超级管理员可以操作访问所有的库,超级管理员还可以在使用不同的库给不同的库分别创建用户权限。

1、创建超级管理员用户  

use admin  // 使用系统自带的admin库

 db.createUser({ user: 'admin', pwd: '123456', roles: [{ role: 'root', db: 'admin' }] })    // 创建用户 角色是 root 就是所有权限都有

2、修改mongodb数据库配置文件( mongodb 中 bin 目录中的 mongod.cfg 文件; 我的是  C:\MongoDB\bin\mongod.cfg)配置:

security:
    authorization: enabled

3、重启mongodb数据库 mongod --dbpath C:\DBdata\data --auth ;这里需要添加 后缀 --auth表示启动数据库启用权限,此时再使用 mongo 进行连接可以连接,但是不能对数据库进行任何操作了。

4、使用超级管理员账户连接数据库

mongo admin -u admin -p 123456   // 表示连接admin库,使用超级管理员的账号密码

如果是远程的话:mongo 远程ip地址:端口号/数据库名 -u 用户名 -p 密码

在我们开发的时候一般都是由超级管理员,给我们创建一个用户,这个用户只能操作和我们所作的项目相关的库,一般不会给我们超级管理员的用户,例如:我们新建一个只能操作数据库 abc 的用户

1、首先切换到abc数据库   use abc 

2、创建用户  db.createUser({ user: 'zhangsan', pwd: '123456', roles: [{ role: 'dbOwner', db: 'abc' }]  })

3、退出当前管理员重新登录用户 zhangsan  ; 登录: mongo abc -u zhangsan -p 123456

4、此时查看数据库 show dbs 只能查看/操作  abc  库了

数据库角色 数据库角色链接 :我们一般常用的就是 root (管理员所有权限)、dbOwner(操作当前库的所有权限)就足够了

补充:使用 node.js 使用 mongose 连接接mongodb 的时候,如果没有设置用户权限直接连接就可以了:

const mongose = require('mongoose')
mongose.connect('mongodb://127.0.0.1/shop', { useNewUrlParser: true, useUnifiedTopology: true }, (err, res) => {
    if(err) throw err;
    console.log('connect Mongodb success !')
})


module.exports = mongose;

但是如果我们设置了用户权限连接的时候需要这样配置:mongodb://用户名:密码@地址/库名?authSource=admin

const mongose = require('mongoose')

mongose.connect('mongodb://admin:123456@localhost:27017/shop', { useNewUrlParser: true, useUnifiedTopology: true, authSource: 'admin' }, (err, res) => {
    if(err) throw err;
    console.log('connect Mongodb success !')
})


module.exports = mongose;

ps:重点是添加了参数 authSource: 'admin' ;如果是原生的 nodejs 连接 ,url 需要写成: url: 'mongodb://admin:123456@localhost:27017/shop?authSource=admin'.

5、删除abc的用户命令:db.dropUser('zhangsan')

6、修改用户密码命令: db.updateUser( 'admin', { pwd: '111111' })

7、第二种连接认证方法 db.auth(用户名, 密码):先输入我们需要连接的库 mongo admin (连接admin库);然后进行用户名密码认证 db.auth('admin', '123456') ; 这样也可以登录成功进行操作

这篇文章就写到这里,下一篇文章是mongodb数据库入门最后一篇,介绍一些mongodb中的高级查询功能 aggregate 聚合管道的用法,写的不好的或者有疑问的大家可以留言讨论,感觉还可以有帮助的可以点赞打赏一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章