標籤:驅動   解決   val   ++   分布   json格式   資料恢複   sort   管理   
1. 簡介
  MongoDB 是一個基於分布式檔案儲存體的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充的高效能資料儲存解決方案。一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。它支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料類型。Mongo最大的特點是它支援的查詢語言非常強大,其文法有點類似於物件導向的查詢語言,幾乎可以實作類別似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。如果你問我mongodb與mysql有啥關係,我說就像JavaScript和Java。
2. 特性
  MongoDB 的設計目標是高效能、可擴充、易部署、易使用,儲存資料非常方便。其主要功能特性如下:
(1)面向集合儲存,容易儲存物件類型的資料(在MongoDB 中資料被分組儲存在集合中,集合類似RDBMS 中的表,一個集合中可以儲存無限多的文檔)。(2)模式自由,採用無模式結構儲存(在MongoDB 中集合中儲存的資料是無模式的文檔,採用無模式儲存資料是集合區別於RDBMS 中的表的一個重要特徵)。(3)支援完全索引,可以在任意屬性上建立索引,包含內部對象(MongoDB的索引和RDBMS 的索引基本一樣,可以在指定屬性、內部對象上建立索引以提高查詢的速度)。(4)支援查詢(MongoDB 支援豐富的查詢操作,MongoDB 幾乎支援SQL中的大部分查詢)。(5)強大的彙總工具(MongoDB 除了提供豐富的查詢功能外,還提供強大的彙總工具,如count、group 等,支援使用MapReduce 完成複雜的彙總任務)。(6)支援複製和資料恢複(MongoDB 支援主從複製機制,可以實現資料備份、故障恢複、讀擴充等功能)。(7)使用高效的位元據儲存,包括大型物件(如視頻)。使用二進位格式儲存,可以儲存任何類型的資料對象。(8)自動處理分區,以支援雲端運算層次的擴充(MongoDB 支援叢集自動切分資料,對資料進行分區可以使叢集儲存更多的資料,實現更大的負載,也能保證儲存的負載平衡)。(9)支援Perl、PHP、Java、C#、JavaScript、Ruby、C 和C++語言的驅動程式(MongoDB 提供了當前所有主流開發語言的資料庫驅動包,開發人員可以輕鬆變成訪問MongoDB 資料庫)。(10)檔案儲存體格式為BSON(JSON 的一種擴充)(BSON 是對二進位格式的JSON 的簡稱,BSON 支援文檔和數組的嵌套)。(11)可以通過網路訪問(可以通過網路遠端存取MongoDB 資料庫)。
3. 核心
  在mongodb中基本核心的概念是文檔、集合、資料庫,具體見下表:
4. 優點
 - - 高可擴充性
 
 - - 分散式運算
 
 - - 低成本
 
 - - 架構靈活,半結構化資料
 
 - - 關係簡潔,操作簡單有效 
 
5. 缺點
 - - 沒有標準化
 
 - - 有限的查詢功能(到目前為止)
 
 - - 安全性有限
 
6. 安裝
  使用brew安裝,此外也可以使用 curl 命令來下載安裝:
brew install mongodb/sudo brew install mongodb
   如果出現所示內容即表示安裝成功,Mac新手使用brew的時候一定要多注意執行命令之後的一些資訊,就提示了mongodb 的安裝路徑為 /usr/local/Cellar/mongodb,如果需要修改mongodb的配置資訊可以執行命令 mongod --config /usr/local/etc/mongod.conf;
7. 配置
  安裝成功之後不要著急啟動,如果之前已經成功使用過,那就可以忽略配置這一項了,配置的話首先要知道資料庫儲存的預設目錄為根目錄下的data/db;
mkdir -p /data/db           // 需要建立一個目錄,為mongodb預設的資料寫入目錄
chown `id -u` /data/db      // 給剛剛建立的目錄以可讀可寫的許可權 
mongo --dbpath dir_name     // 也可以修改目錄,dir_name 為你的目錄名字
8. 啟動
  配置好以上資訊之後就可以啟動了,其實用brew管理這些軟體特別方便,所有的命令也幾乎相同;
brew services start mongodb/mongod
  如果出現所示“Successfully started ‘mongodb‘”即表示啟動成功;
9. 串連
  成功啟動之後執行mongo命令串連資料庫,可能會出現:
   如果成功出現所示內容,並且出現箭頭表示資料庫連接成功,如果沒有串連成功的話可能是由於你之前使用並非正常關閉導致生產了mongod.lock檔案,意思是把資料庫暫時性鎖住了,可以找到該檔案直接刪除並重新啟動,如果還是不行的話可以使用命令ps -aef | grep mongo查看佔有的進程,通過命令kill - 9 id(進程號)殺死這個不再使用的進程,嘗試重新啟動即可;
10. 建立資料庫(增)
  MongoDB 有建立新的資料庫的文法格式如下:(預設的資料庫為 test,如果你沒有建立新的資料庫,集合將存放在 test 資料庫中)
show databases               //  show  查看有哪些資料庫,也可show dbsuse demo                     //  use  建立資料庫(如果資料庫不存在,則建立資料庫,否則切換到指定資料庫)show collections             //  查看有哪些集合(collections相當於SQL中的一個個表)db.createCollection(‘movie‘)        //  建立集合(相當於建立表)
11. 刪除資料庫(刪)
  MongoDB 刪除資料庫的文法格式如下:(刪除當前資料庫,預設為 test,你可以使用 db 命令查看當前資料庫名,這個命令一定要學會,刪庫跑路必備)
db.dropDatabase()        //  刪除當前資料庫,可以用use進行選擇資料庫來刪除db.collection.drop()     //  刪除當前資料庫中的集合collection 
12. 插入資料庫(插)
  MongoDB 使用 insert() 或 save() 方法向集合中插入資料,文法如下:
db.collection.insert(document)  //  給集合collection中插入資料,如果該集合不在該資料庫中, MongoDB 會自動建立該集合并插入文檔db.collection.save(document)    //  如果不指定 _id 欄位 save() 方法類似於 insert() 方法。如果指定 _id 欄位,則會更新該 _id 的資料
  insert插資料時有幾點需要注意一下:
 - 1. 不同key-value需要用逗號隔開,而key:value中間是用冒號,按照標準的json格式來寫;
 
 - 2. 如果一個key有多個value,value要用[]。哪怕當前只有一個value,也盡量加上[]以備後續的添加;
 
 - 3. 整個“資料區塊”要用{}括起來;
 
 - 4. 如果不指定ID的話,資料庫預設會自動建立一個ID號,在同一個資料庫裡,每個文檔的ID號是不同的;
 
13. 更新資料庫(改)
  MongoDB 使用 update() 和 save() 方法來更新集合中的文檔,文法如下:
update() 方法用於更新已存在的文檔。文法格式如下:db.collection.update(   <query>,  //  update的查詢條件,類似sql update查詢內where後面的   <update>,  //  update的對象和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的   {     upsert: <boolean>,  //  可選,這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入     multi: <boolean>,  //  可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新     writeConcern: <document>  //  可選,拋出異常的層級   })save() 方法通過傳入的文檔來替換已有文檔。文法格式如下:db.collection.save(   <document>,  //  文檔資料,如果與之前的文檔全部value值都有變化則會重新建立,所以必須保留一部分value值相同才會更新;   {     writeConcern: <document>  //  可選,拋出異常的層級;   }) 
14. 查詢資料庫(查)
  MongoDB 查詢文檔使用 find() 方法。find() 方法以非結構化的方式來顯示所有文檔,可以傳入各種不同的查詢條件,查詢資料的文法格式如下:
db.collection.find(query, projection) query :可選,使用查詢操作符指定查詢條件;projection :可選,使用投影操作符指定返回的鍵。查詢時返迴文檔中所有索引值,只需省略該參數即可(預設省略)db.collection.find().pretty()  //  pretty() 方法以格式化的方式來顯示所有文檔db.collection.findOne()  //  只返回一條資料
15. 進階($type操作符/limit()/skip()/sort()/索引/分區/備份/監控/拓展)
  MongoDB 更進階的一些常見操作文法格式如下:
db.collection.find().pretty()       //  格式化輸出db.collection.find().count()        //  查看集合中文檔的個數db.collection.find().skip()         //  跳過指定數量的資料db.collection.find().limit()        //  讀取指定記錄的條數db.collection.find().sort({key:1})  //  通過參數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而-1是用於降序排列db.collection.getIndexes()          //  查看集合索引情況db.collection.dropIndexes()         //  刪除索引(不會刪除 _id 索引)db.collection.createIndex({key:1})  //  建立索引(參數key 為你要建立的索引欄位,1為按升序建立索引,-1為按降序建立索引)db.collection.aggregate($group)     //  彙總主要用於處理資料(如平均值,求和等),並返回計算後的資料結果,類似sql語句中的 count(*)。$gt大於$gte大於等於$lt小於$lte小於等於$ne不等於
   這些進階的常見操作,具體使用方法可以查看官方文檔http://www.mongodb.org.cn/tutorial,當然你感興趣的話可以為中文社區做貢獻;
16. 總結
  MongoDB 的學習也有幾天了,現在終於有時間可以總結記錄下來,本文主要是一些mongodb的核心基礎部分,比較適用於Mac新手學習,具體的作業碼也貼了出來,可以少走很多彎路,如果你也一步步的跟著步驟學到了這裡,應該算是基本入門了吧,至於放棄也是一種美,既然堅持學到了這裡,相信你也不會放棄的。其實這隻是年前一個大項目的奠基工作,接下來就準備著手開發vue+webpack+es6+nodejs+mongodb的全棧項目了,如果你也想瞭解學習,歡迎繼續關注我!
我的部落格:http://www.cnblogs.com/lewiscutey
我的web: https://lewiscutey.github.io
我的公眾號:天道酬勤Lewis
Mac新手從入門到放棄MongoDB