MongoDB的使用

Winter發表於2019-05-08

今天來學習一個新的資料庫,叫做MongoDB資料庫,我們先來了解一下MongoDB資料庫的概念,再一起學習如何使用MongoDB資料庫吧~

MongoDB的概念

  • MongoDB是專為 可擴充套件性、高效能和高可用性 而設計的資料庫,MongoDB的庫中由一個或多個collections組成,這裡的collection相當於關係型資料庫中的表;

  • MongoDB中的記錄是一個document文件,它是由欄位和值對組成的資料結構,MongoDB文件類似於JSON物件,欄位的值可以包括其他文件,陣列和文件陣列;

  • MongoDB支援的資料型別有: Int、Double, String, Object, Array, Binary data, Undefined, Boolean, Date, Null 等;

MongoDB的命令介紹


db.help()                    檢視庫級別的命令
db.mycoll.help()             檢視collection級別的命令
sh.help()                    檢視發片的命令
rs.help()                    檢視副本集的命令
help admin                   檢視管理相關的命令
help connect                 檢視連線到資料庫的命令
help keys                    keys的相關命令
help misc                    misc things to know
help mr                      檢視mapreduce相關的命令
show dbs                     檢視當前的資料庫
show collections             檢視資料庫中所有的collections
show users                   當前的資料庫中有哪些使用者
show profile                 顯示profile資訊,顯示效能評估工具
show logs                    顯示日誌名資訊
show log [name]              顯示指定檢視對應日誌的資訊
use <db_name>                進入某庫,設定某庫為當前庫
db.foo.find()                列出當前collection中所有的document
db.foo.find( { a : 1 } )     列出當前collection中a = 1的document
it                           result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x   設定顯示的item的行數
exit                         退出Mongo shell

CRUD操作

  • db.students.insert() :插入一條資料,預設會建立students表;

  • show collections :顯示當前的表;

  • db.students.stats() :顯示students表的資料資訊;

  • db.students.find() :查詢插入的各個欄位;

  • db.students.count() :檢視students表中有多少個document;

Collection的簡單查詢過濾操作


db.students.remove({"name": "Angle"})
# 刪除表
db.students.drop()
# 刪除當前資料庫
db.dropDatabase()

find()的高階用法

比較操作:

  • $gt :大於;

db.students.find({age: {$gt: 10}})  age大於10

  • $gte :大於等於;

db.students.find({age: {$gte: 20}})  age大於等於20

  • $lt :小於;

db.students.find({age: {$lt: 30}})  age小於30

  • $lte :小於等於;

db.students.find({age: {$lte: 40}})  age小於等於40

  • $in :在範圍內;

db.students.find({age: {$in: [10, 20]}})  age在[10, 20]的document

  • $nin :不在範圍內;

db.students.find({age: {$nin: [30, 40]}})  age不在[30, 40]的document

邏輯運算:

  • $or :或運算;

db.students.find({$or: [{name: {$eq: "robby"}}, {age: {$nin: [40,50]}}]})

  • $and :與運算;

  • $not :非運算;

  • $nor: 取反運算;

元素查詢:

  • $exists :查詢存在某欄位的document;

如查詢存在name欄位的document
db.students.find({name: {$exists: true}})

  • $mod :取摸;

  • $type :返回指定欄位的值型別為指定型別的document;

update()的高階用法

  • $set :更新,或插入欄位的值;

將name為Tom的這個document的age欄位的值改為20
db.students.update({name: "Tom"}, {$set: {age: 20}})

  • $unset :刪除指定欄位;

刪除name欄位為Tom的document的age為25的欄位
db.students.update({name: "Tom"}, {$unset: {age: 25}}

  • $rename :修改欄位名;

 給name欄位為Tom的document增加一個欄位sex且值為男
db.students.update({name: "Tom"}, {$inc: {sex: "男"}})

createUser()方法


# 建立使用者
db.createUser({user:"root",pwd:"123456", roles: [{ role: "root", db: "admin" }]}); 
# 刪除使用者
db.system.users.remove({user:"root"});

  • 方法中的 user 用於指定使用者名稱、 pwd 用於設定密碼、 roles 用於指定使用者的角色,可以用一個空陣列給新使用者設定空角色、 db 用於指定使用者對哪個資料庫具有管理員許可權;

  • createUser()方法 為資料庫建立新使用者,如果使用者已存在於資料庫中,則db.createUser()返回重複的使用者錯誤;

角色種類說明

  • 資料庫使用者角色 read (允許使用者讀取指定資料庫)、 readWrite (允許使用者讀寫指定資料庫 );

  • 資料庫管理角色 dbAdmin (允許使用者在指定資料庫中執行管理函式)、 dbOwner userAdmin (允許使用者向system.users集合寫入);

  • 叢集管理角色 clusterAdmin (賦予使用者所有分片和複製集相關函式的管理許可權)、 clusterManager clusterMonitor hostManager

  • 備份恢復角色 backup restore

  • 所有資料庫角色 readAnyDatabase readWriteAnyDatabase (賦予使用者所有資料庫的讀許可權 )、 userAdminAnyDatabase (賦予使用者所有資料庫的讀寫許可權 )、 dbAdminAnyDatabase (賦予使用者所有資料庫的dbAdmin許可權);

  • 超級使用者角色 root (超級賬號,超級許可權);

  • 內部角色 __system

Mongodb Index 介紹

  • MongoDB中的索引與MySQL中的索引有類似的功能,將表中的欄位新增索引,索引會將欄位做排序,依次索引能夠大大提高MongoDB的查詢能力

  • 索引是特殊的資料結構,它以易於遍歷的形式儲存集合資料集的一小部分,索引儲存特定欄位或欄位集的值,按欄位值排序;

  • 索引條目的排序支援有效的等式匹配和基於範圍的查詢操作;

  • MongoDB可以使用索引中的順序返回排序結果;


db.students.createIndex({name: 1})
給name欄位建立索引, 1為指定按升序建立索引,如果你想按降序來建立索引指定為-1即可
# 檢視索引
db.students.getIndexes()
# 檢視是否使用到了索引(由於MongoDB調優)
db.students.find({"name": "Angle"}).explain()  # winningPlan的stage為fetch,非COLLSCAN(欄位掃描)
# 刪除索引
db.student.dropIndex("name_1")
# 給name欄位建立一個唯一鍵索引,那麼再給students表增加一條行document,且name與之前存在的document的name值相同,那麼就會報錯, 如:增加一條document
db.students.createIndex({name: 1}, {unique: true})
db.students.insert({name: "Angle"})
報錯的資訊如下:
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.students.$name_1  dup key: { : \"Angle\" }"
        }
})

參考: https://www.9xkd.com/user/plan-view.html?id=1609408774

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69908432/viewspace-2643659/,如需轉載,請註明出處,否則將追究法律責任。

相關文章