1. 程式人生 > >MongoDB 基礎(2019年開篇)

MongoDB 基礎(2019年開篇)

MongoDB基礎:

1、什麼是MongoDB
 NoSQL(NoSQL=Not Only SQL),意即"不僅僅是SQL"。
 MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
 
 MongoDB是由C++編寫的,MongoDB語法類似JS,是一個基於分散式檔案儲存的開源資料庫系統。
 在高負載的情況下,新增更多的節點,可以保證伺服器效能。
 MongoDB旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。
 MongoDB將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB文件類似於JSON物件。欄位值可以包含其他文件,陣列及文件陣列。

 示例:
 {
    name: 
"wangchunwang", age: 26, groups: ["news", "sports"] } 假設上述文件所在的集合是testcoll,那麼以下幾種查詢鍵值方法等效: > db.testcoll.findOne().name // 點鏈式訪問 > db["test"].findOne()["name"] // 陣列式訪問 2、進入MongoDB Shell 在cmd中輸入> mongo [-u username -p pwd] 檢視當前操作的資料庫:> db 顯示所有資料庫:> show dbs 連線到指定的資料庫:
> use db_name // 不存在,則新建之 有一些資料庫名是保留的: admin:從許可權的角度來看,這是"root"資料庫。要是將一個使用者新增到這個資料庫,這個使用者自動繼承所有資料庫的許可權。一些特定的伺服器端命令也只能從這個資料庫執行,比如列出所有的資料庫或者關閉伺服器。 local: 這個資料永遠不會被複制,可以用來儲存限於本地單臺伺服器的任意集合。 config: 當Mongo用於分片設定時,config資料庫在內部使用,用於儲存分片的相關資訊。 建立使用者: > db.createUser({ user: "root", pwd:
"root", roles: [{ role: "dbAdmin", db: "test" }] }) 3、Mongo中的一些概念 --------------+------------------------+------------------------------------------- SQL術語/概念 MongoDB術語/概念 解釋/說明 --------------+------------------------+------------------------------------------- database database 資料庫 --------------+------------------------+------------------------------------------- table collection 資料庫表/集合 --------------+------------------------+------------------------------------------- row document 資料記錄行/文件 --------------+------------------------+------------------------------------------- column field 資料欄位/域 --------------+------------------------+------------------------------------------- index index 索引 --------------+------------------------+------------------------------------------- table joins 表連線,MongoDB不支援 --------------+------------------------+------------------------------------------- primary key primary key 主鍵,MongoDB自動將"_id"欄位設定為主鍵 --------------+------------------------+------------------------------------------- ObjectId:類似唯一主鍵,包含12個位元組: 前4個位元組表示建立unix時間戳,接下來的3個位元組是機器標識碼,緊接的2個位元組是程序id,最後3個位元組是隨機數。 由於ObjectId中儲存了建立的時間戳,所以你不需要為你的文件儲存時間戳欄位,可以通過"getTimestamp()"來獲取文件的建立時間戳: ObjectId("5c263a0a1968ec6c090e57fd").getTimestamp() // 返回時間戳 ObjectId("5c263a0a1968ec6c090e57fd").str // 返回字串 MongoDB無須宣告資料型別,全自動匹配。 4、建立資料庫 > use db_name 名稱通常小寫。 MongoDB中預設的資料庫為test,如果你沒有建立新的資料庫,集合將存放在test資料庫中。 5、刪除資料庫 首先連線到要刪除的資料庫: > use db_name > db.dropDatabase() 6、建立集合 > db.createCollection(name [,options]) 名稱通常小寫。 options引數說明: capped:如果為 true 或 1 ,則建立固定集合。固定集合是指有著固定大小的集合,當達到最大值時,它會自動覆蓋最早的文件。 size:當capped為true時須指定該引數值,固定集合最大值。單位:KB。 max:可選,固定集合最大文件數。單位:個。 7、刪除集合 > db.collection_name.drop() 8、插入文件 > db.collection_name.insert({key: value, ...}) 文件的資料結構和JSON基本一樣。 9、更新文件 > db.collection_name.update(query, update [,options]) 引數說明: query:查詢條件。例{name: "wangchunwang"}。 update:更新操作符(如$set,$unset,$inc等原子操作,$unset是移除鍵值對)。例{$set: {name: "wcwnina"}}、{$unset: {salary: 1}}。 options引數說明: upsert:布林型,查無結果是否插入文件。預設false。 multi:布林型,是否更新全部查詢結果。預設false。 > db.collection_name.save(document) // 替換整個文件 10、刪除文件 > db.collection_name.remove([query, options]) 引數說明: query:查詢條件。 options引數說明: justOne:布林型,是否只刪除一條。預設false。 11、查詢文件 > db.collection_name.find([query, projection]) 引數說明: query:查詢條件。 projection:返回指定的鍵,true或1返回,false或0不返回。例{name: 1, salary: 1}。 格式化顯示結果: > db.collection_name.find().pretty() AND條件: MongoDB的find()方法可以傳入多個鍵,每個鍵以逗號隔開,即常規SQL的AND條件。 OR條件: MongoDB的OR條件語句使用了操作符$or。如:> db.collection_name.find({$or: [{key1: value1}, {key2: value2}]}) 關係比較符: 小於:$lt 小於或等於:$lte 大於:$gt 大於或等於:$gte 不等於:$ne 屬於:$in> db.collection_name.find({salary: {$lt: 10000, $gt: 5000}})。 // 5000<salary<10000 模糊查詢:使用JS正則表示式。 > db.collection_name.find({name: /wangchunwang/}) // 包含 > db.collection_name.find({name: /^wangchunwang/}) // 以...開頭 > db.collection_name.find({name: /wangchunwang$/}) // 以...結尾 limit(number)方法:限制讀取文件數量。 skip(number)方法:開頭跳過的文件數量。效率很差,影響查詢速率。 skip()和limit()組合能實現分頁。 例> db.collection_name.find().skip(1).limit(10) // 跳過第一個,從第二個開始,查詢10個文件 排序sort(): > db.collection_name.find().sort({key: 1或-1}) // 1升序,-1降序 總結:skip(),limilt(),sort()三個放在一起執行的時候,執行的順序是先sort(),然後是skip(),最後是顯示的limit()。 12、建立索引 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取資料時必須掃描集合中的每個檔案並選取那些符合查詢條件的記錄。這種掃描全集合的查詢效率是非常低的。 索引可以級聯,即可以為子文件的鍵建立索引。 > db.collection_name.createIndex({key: 1或-1} [,options]) // 1升序索引,-1降序索引 options引數說明: name:索引的名稱。如果未指定,通過連線索引的鍵名和排序順序生成一個索引名稱。 unique:建立的索引是否唯一。若為true或1則建立唯一索引,那麼該鍵的值唯一。預設值為false。 檢視集合索引: > db.collection_name.getIndexes() 檢視集合索引大小: > db.collection_name.totalIndexSize() 刪除集合指定索引: > db.collection_name.dropIndexes() 刪除集合所有索引: > db.collection_name.dropIndex(index_name) 13、聚合 MongoDB中聚合(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。 > db.collection_name.aggregate(operations) $sum 計算總和。 $avg 計算平均值。 $max 獲取集合中所有文件對應值的最大值。 例> db.collection_name.aggregate({$group: {_id: 0, total: {$sum: "$salary"}}}) // _id的值為分組依據,total為自定義鍵,$為引用某個鍵 14、MongoDB複製(replSet) MongoDB複製是將資料實時同步在多個伺服器上。 MongoDB複製需要主從節點,主節點負責處理客戶端請求,其餘都是從節點,負責複製主節點上的資料。 各個節點常見的搭配方式為:一主一從、一主多從。 副本集特徵: a)N個節點的叢集; b)所有寫入操作都在主節點上; c)主從實時複製,任何節點可作為主節點; d)自動故障轉移和恢復,高可用性。 具體操作(略) 15、MongoDB分片(shard) 在Mongodb裡面存在另一種叢集,就是分片技術,可以滿足MongoDB資料量大量增長的需求。 三個主要元件: Shard:用於儲存實際的資料塊,實際生產環境中一個shard server角色可由幾臺機器組一個replica set承擔,防止主機單點故障 Config Server:mongod例項,儲存了整個 ClusterMetadata,其中包括 chunk資訊。 Query Routers:前端路由,客戶端由此接入,且讓整個叢集看上去像單一資料庫,前端應用可以透明使用。 16、MongoDB備份(mongodump)與恢復(mongorestore) 備份:使用mongodump命令匯出所有資料到指定目錄中。 > mongodump -h host -p port -d db_name -o bakdir 例:mongodump -h 127.0.0.1 -p 27017 -d test -o E:\bakdata 引數說明: -h:MongDB所在伺服器IP。 -p:MongDB所在伺服器埠。 -d:需要備份的資料庫例項。 -o:備份的資料存放位置。 恢復:使用mongorestore命令來匯入備份的資料。 > mongorestore -h host -p port -d db_name bakpath 例:mongorestore -h 127.0.0.1 -p 27017 -d test E:\bakdata\test 17、MongoDB監控 MongoDB中提供了mongostat和mongotop兩個命令來監控MongoDB的執行情況。 mongostat [seconds]命令:狀態檢測工具。 mongotop [seconds]命令:每個集合的讀寫時間統計。 18、MongoDB查詢分析 詢分析常用函式:explain() > db.collection_name.find({name: "wangchunwang"}).explain() 19、MongoDB關係 引用式關係是設計資料庫時經常用到的方法,通過引用文件的_id欄位來建立關係。 例{ adress_id: { $ref: "collection_name", // 引用的集合 $id: ObjectId("5c263a0a1968ec6c090e57fd"), // 引用的文件_id $db: "db_name" // 引用的資料庫 } } 19、原子操作常用命令 $set 用來指定一個鍵並更新鍵值,若鍵不存在並建立。 { $set: { key: value } } $unset 用來刪除一個鍵。 { $unset: { key: 1} } $inc 對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作。 { $inc: { key: value } } $push 把value追加到key裡面去,key一定要是"陣列"型別才行,如果key不存在,會新增一個"陣列"型別加進去。 { $push: { key: value } } $pull 從"陣列"key內刪除一個等於value值。 { $pull: { key: value } } $addToSet 增加一個值到"陣列"內,而且只有當這個值不在"陣列"內才增加(不重複增加)。 $pop 刪除"陣列"的最後一個或第一個元素。 { $pop: { key: 1 } } // 1是最後一個,-1是第一個 $rename 修改鍵名稱。 { $rename: { old_key_name: "new_key_name" } } 20、MapReduce 詳見:https://www.cnblogs.com/wcwnina/p/9494706.html 21、全文索引 給文件的多個鍵建立text全文索引後,就可以在整個集合中根據關鍵字搜尋出文檔。 關鍵字是單詞,對中文支援很差。 建立全文索引: > db.collection_name.createIndex({key1: "text", key2: "text"}) 使用全文索引: > db.collection_name.find({$text: {$search: "keyword1 keyword2"}) // 多個關鍵字用空格或逗號隔開 22、正則表示式 正則表示式是使用單個字串來描述、匹配一系列符合某個句法規則的字串。與JS正則表示式語法一致。 直接使用正則表示式: > db.collection_name.find({key: {$regex: /mongo/}) // 採用$regex操作符。i忽略大小寫,m多行匹配 以上查詢也可以寫為: > db.collection_name.find({key: /mongo/}) // 直接採用JS正則表示式

待續。。。