MongoDB 基礎(2019年開篇)

MongoDB基礎知識:html

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 [ip:port/database -u username -p]

 查看當前操做的數據庫:> db
 顯示全部數據庫:> show dbs
 鏈接到指定的數據庫:> use db_name        // 不存在,則新建之

 有一些數據庫名是保留的:
 admin:從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承全部數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,好比列出全部的數據庫或者關閉服務器。
 local: 這個數據永遠不會被複制,能夠用來存儲限於本地單臺服務器的任意集合。
 config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。
 
 建立用戶(用戶是基於數據庫的):
 > use test        // 先切換到某個數據庫,再建立用戶
 > db.createUser({
    user: "root",
    pwd: "root",
    roles: [{ role: "dbAdmin", db: "test" }]    // 經常使用角色:read、readWrite、dbAdmin、root / readAnyDatabase、readWriteAnyDatabase、dbAdminAnyDatabase
    })
    
 修改用戶密碼:> db.changeUserPassword(username, password)
 受權用戶角色:> db.grantRolesToUser(username, roles [,writeConcern])
 刪除用戶:
    > use test      // 須要先切換到該數據庫,不然刪除不成功
    > db.dropUser(username)

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(index_name)
 刪除集合全部索引:
   > db.collection_name.dropIndex()
   
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/i})    // 採用$regex操做符。i忽略大小寫,m多行匹配
 以上查詢也能夠寫爲:
 > db.collection_name.find({key: /mongo/i})                // 直接採用JS正則表達式

 

待續。。。前端

相關文章
相關標籤/搜索