1. 程式人生 > >Mac新手從入門到放棄MongoDB

Mac新手從入門到放棄MongoDB

配置信息 -c post 故障 可選 apr gin display 逗號

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 dbs
use 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