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 聚合管道的用法,寫的不好的或者有疑問的大家可以留言討論,感覺還可以有幫助的可以點贊打賞一下。

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