Mongodb快速上手(未完成,持續更新中)
1. MongoDB相關概念
1.1 業務應用場景
傳統的關係型資料庫(如MySQL),在資料操作的“三高”需求以及應對Web2.0的網站需求面前,顯得力不從心。
解釋:“三高”需求:
- High performance - 對資料庫高併發讀寫的需求。
- Huge Storage - 對海量資料的高效率儲存和訪問的需求。
- High Scalability && High Availability- 對資料庫的高可擴充套件性和高可用性的需求。
而MongoDB可應對“三高”需求。
具體的應用場景如:
- 社交場景,使用 MongoDB 儲存儲存使用者資訊,以及使用者發表的朋友圈資訊,通過地理位置索引實現附近的人、地點等功能。
- 遊戲場景,使用 MongoDB 儲存遊戲使用者資訊,使用者的裝備、積分等直接以內嵌文件的形式儲存,方便查詢、高效率儲存和訪問。
- 物流場景,使用 MongoDB 儲存訂單資訊,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌陣列的形式來儲存,一次查詢就能將
訂單所有的變更讀取出來。 - 物聯網場景,使用 MongoDB 儲存所有接入的智慧裝置資訊,以及裝置彙報的日誌資訊,並對這些資訊進行多維度的分析。
- 視訊直播,使用 MongoDB 儲存使用者資訊、點贊互動資訊等。
這些應用場景中,資料操作方面的共同特點是:
- 資料量大
- 寫入操作頻繁(讀寫都很頻繁)
- 價值較低的資料,對事務性要求不高
對於這樣的資料,我們更適合使用MongoDB來實現資料的儲存。
什麼時候選擇MongoDB
在架構選型上,除了上述的三個特點外,如果你還猶豫是否要選擇它?可以考慮以下的一些問題:
應用不需要事務及複雜 join 支援
新應用,需求會變,資料模型無法確定,想快速迭代開發
應用需要2000-3000以上的讀寫QPS(更高也可以)
應用需要TB甚至 PB 級別資料儲存
應用發展迅速,需要能快速水平擴充套件
應用要求儲存的資料不丟失
應用需要99.999%高可用
應用需要大量的地理位置查詢、文字查詢
如果上述有1個符合,可以考慮 MongoDB,2個及以上的符合,選擇 MongoDB 絕不會後悔。
思考:如果用MySQL呢?
答:相對MySQL,可以以更低的成本解決問題(包括學習、開發、運維等成本)
1.2 MongoDB簡介
MongoDB是一個開源、高效能、無模式的文件型資料庫,當初的設計就是用於簡化開發和方便擴充套件,是NoSQL資料庫產品中的一種。是最像關係型資料庫(MySQL)的非關係型資料庫。
它支援的資料結構非常鬆散,是一種類似於 JSON 的 格式叫BSON,所以它既可以儲存比較複雜的資料型別,又相當的靈活。
MongoDB中的記錄是一個文件,它是一個由欄位和值對(field:value)組成的資料結構。MongoDB文件類似於JSON物件,即一個文件認為就是一個物件。欄位的資料型別是字元型,它的值除了使用基本的一些型別外,還可以包括其他文件、普通陣列和文件陣列。
1.3 體系結構
MySQL和MongoDB對比
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 資料庫表/集合 |
row | document | 資料記錄行/文件 |
column | field | 資料欄位/域 |
index | index | 索引 |
table joins | 表連線,MongoDB不支援 | |
嵌入文件 | MongoDB通過嵌入式文件來替代多表連線 | |
primary key | primary key | 主鍵,MongoDB自動將_id欄位設定為主鍵 |
1.4 資料模型
MongoDB的最小儲存單位就是文件(document)物件。文件(document)物件對應於關係型資料庫的行。資料在MongoDB中以BSON(Binary-JSON)文件的格式儲存在磁碟上。
BSON(Binary Serialized Document Format)是一種類json的一種二進位制形式的儲存格式,簡稱Binary JSON。BSON和JSON一樣,支援內嵌的文件物件和陣列物件,但是BSON有JSON沒有的一些資料型別,如Date和BinData型別。
BSON採用了類似於 C 語言結構體的名稱、對錶示方法,支援內嵌的文件物件和陣列物件,具有輕量性、可遍歷性、高效性的三個特點,可以有效描述非結構化資料和結構化資料。這種格式的優點是靈活性高,但它的缺點是空間利用率不是很理想。
Bson中,除了基本的JSON型別:string,integer,boolean,double,null,array和object,mongo還使用了特殊的資料型別。這些型別包括date,object id,binary data,regular expression 和code。每一個驅動都以特定語言的方式實現了這些型別,檢視你的驅動的文件來獲取詳細資訊。
BSON資料型別參考列表
資料型別 | 描述 | 舉例 |
---|---|---|
字串 | UTF-8字串都可表示為字串型別的資料 | {"x" : "foobar"} |
物件id | 物件id是文件的12位元組的唯一 ID | {"X" :ObjectId() } |
布林值 | 真或者假:true或者false | {"x":true}+ |
陣列 | 值的集合或者列表可以表示成陣列 | {"x" : ["a", "b", "c"]} |
32位整數 | 型別不可用。 | JavaScript僅支援64位浮點數,所以32位整數會被自動轉換。 |
64位整數 | 不支援這個型別。 | shell會使用一個特殊的內嵌文件來顯示64位整數 |
64位浮點數 | shell中的數字就是這一種型別 | {"x":3.14159,"y":3} |
null | 表示空值或者未定義的物件 | {"x":null} |
undefined | 文件中也可以使用未定義型別 | {"x":undefined} |
符號 | shell不支援,shell會將資料庫中的符號型別的資料自動轉換成字串 | |
正則表示式 | 文件中可以包含正則表示式,採用JavaScript的正則表示式語法 | {"x" : /foobar/i} |
程式碼 | 文件中還可以包含JavaScript程式碼 | {"x" : function() { /* …… */ }} |
二進位制資料 | 二進位制資料可以由任意位元組的串組成,不過shell中無法使用 | |
最大值/最小值 | BSON包括一個特殊型別,表示可能的最大值。shell中沒有這個型別。 |
提示:
shell預設使用64位浮點型數值。{“x”:3.14}或{“x”:3}。對於整型值,可以使用NumberInt(4位元組符號整數)或NumberLong(8位元組符
號整數),{“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
1.5 MongoDB的特點
MongoDB主要有如下特點:
- 高效能:
MongoDB提供高效能的資料永續性。特別是,對嵌入式資料模型的支援減少了資料庫系統上的I/O活動。
索引支援更快的查詢,並且可以包含來自嵌入式文件和陣列的鍵。(文字索引解決搜尋的需求、TTL索引解決歷史資料自動過期的需求、地理位置索引可用於構建各種 O2O 應用)
mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支援滿足各種場景需求。
Gridfs解決檔案儲存的需求。 - 高可用性:
MongoDB的複製工具稱為副本集(replica set),它可提供自動故障轉移和資料冗餘。 - 高擴充套件性:
MongoDB提供了水平可擴充套件性作為其核心功能的一部分。
分片將資料分佈在一組叢集的機器上。(海量資料儲存,服務能力水平擴充套件)
從3.4開始,MongoDB支援基於片鍵建立資料區域。在一個平衡的叢集中,MongoDB將一個區域所覆蓋的讀寫只定向到該區域內的那些
片。 - 豐富的查詢支援:
MongoDB支援豐富的查詢語言,支援讀和寫操作(CRUD),比如資料聚合、文字搜尋和地理空間查詢等。 - 其他特點:如無模式(動態模式)、靈活的文件模型、
2 單機部署
2.1 Windows系統中的安裝啟動
第一步:下載安裝包
MongoDB 提供了可用於 32 位和 64 位系統的預編譯二進位制包,你可以從MongoDB官網下載安裝,MongoDB 預編譯二進位制包下載地址:
https://www.mongodb.com/download-center#community
根據上圖所示下載 zip 包。
提示:版本的選擇:
MongoDB的版本命名規範如:x.y.z;
y為奇數時表示當前版本為開發版,如:1.5.2、4.1.13;
y為偶數時表示當前版本為穩定版,如:1.6.3、4.0.10;
z是修正版本號,數字越大越好。
詳情:http://docs.mongodb.org/manual/release-notes/#release-version-numbers
第二步:解壓安裝啟動
將壓縮包解壓到一個目錄中。
在解壓目錄中,手動建立一個目錄用於存放資料檔案,如 data/db
方式1:命令列引數方式啟動服務
在bin
目錄中開啟命令列提示符,輸入如下命令:
mongod --dbpath=..\data\db
我們在啟動資訊中可以看到,mongoDB的預設埠是27017,如果我們想改變預設的啟動埠,可以通過--port來指定埠。
為了方便我們每次啟動,可以將安裝目錄的bin目錄設定到環境變數的path中, bin 目錄下是一些常用命令,比如 mongod 啟動服務用的,mongo 客戶端連線服務用的。
方式2:配置檔案方式啟動服務
在解壓目錄中新建 config 資料夾,該資料夾中新建配置檔案 mongod.conf ,內如參考如下:
storage:
#The directory where the mongod instance stores its data.Default Value is "\data\db" on Windows.
dbPath: D:\02_Server\DBServer\mongodb-win32-x86_64-2008plus-ssl-4.0.1\data
詳細配置項內容可以參考官方文件:https://docs.mongodb.com/manual/reference/configuration-options/
【注意】
- 配置檔案中如果使用雙引號,比如路徑地址,自動會將雙引號的內容轉義。如果不轉義,則會報錯:
error-parsing-yaml-config-file-yaml-cpp-error-at-line-3-column-15-unknown-escape-character-d
解決:
a. 對 \ 換成 / 或 \
b. 如果路徑中沒有空格,則無需加引號。
- 配置檔案中不能以Tab分割欄位
解決:
將其轉換成空格。
啟動方式:
mongod -f ../config/mongod.conf
或
mongod --config ../config/mongod.conf
更多引數配置:
systemLog:
destination: file
#The path of the log file to which mongod or mongos should send all diagnostic logging information
path: "D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/log/mongod.log"
logAppend: true
storage:
journal:
enabled: true
#The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "D:/02_Server/DBServer/mongodb-win32-x86_64-2008plus-ssl-4.0.1/data"
net:
#bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: false
2.2 Shell連線(mongo命令)
在命令提示符輸入以下shell命令即可完成登陸
mongo
或
mongo --host=127.0.0.1 --port=27017
檢視已經有的資料庫
>show databases
退出mongodb
exit
更多引數可以通過幫助檢視:
mongo --help
提示:
MongoDB javascript shell是一個基於javascript的直譯器,故是支援js程式的。
2.3 Compass-圖形化介面客戶端
到MongoDB官網下載MongoDB Compass,
地址:https://www.mongodb.com/download-center/v2/compass?initial=true
如果是下載安裝版,則按照步驟安裝;如果是下載加壓縮版,直接解壓,執行裡面的 MongoDBCompassCommunity.exe 檔案即可。
在開啟的介面中,輸入主機地址、埠等相關資訊,點選連線:
2.4 Linux系統中的安裝啟動和連線
目標:在Linux中部署一個單機的MongoDB,作為生產環境下使用。
提示:和Windows下操作差不多。
步驟如下:
- 先到官網下載壓縮包 mongod-linux-x86_64-4.0.10.tgz 。
- 上傳壓縮包到Linux中,解壓到當前目錄:
tar -xvf mongodb-linux-x86_64-4.0.10.tgz
- 移動解壓後的資料夾到指定的目錄中:
mv mongodb-linux-x86_64-4.0.10 /usr/local/mongodb
- 新建幾個目錄,分別用來儲存資料和日誌:
#資料儲存目錄
mkdir -p /mongodb/single/data/db
#日誌儲存目錄
mkdir -p /mongodb/single/log
- 新建並修改配置檔案
vi /mongodb/single/mongod.conf
配置檔案的內容如下:
systemLog:
#MongoDB傳送所有日誌輸出的目標指定為檔案
# #The path of the log file to which mongod or mongos should send all diagnostic logging information
destination: file
#mongod或mongos應向其傳送所有診斷日誌記錄資訊的日誌檔案的路徑
path: "/mongodb/single/log/mongod.log"
#當mongos或mongod例項重新啟動時,mongos或mongod會將新條目附加到現有日誌檔案的末尾。
logAppend: true
storage:
#mongod例項儲存其資料的目錄。storage.dbPath設定僅適用於mongod。
##The directory where the mongod instance stores its data.Default Value is "/data/db".
dbPath: "/mongodb/single/data/db"
journal:
#啟用或禁用永續性日誌以確保資料檔案保持有效和可恢復。
enabled: true
processManagement:
#啟用在後臺執行mongos或mongod程序的守護程序模式。
fork: true
net:
#服務例項繫結的IP,預設是localhost
bindIp: localhost,192.168.0.2
#bindIp
#繫結的埠,預設是27017
port: 27017
- 啟動MongoDB服務
[root@bobohost single]# /usr/local/mongodb/bin/mongod -f /mongodb/single/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 90384
child process started successfully, parent exiting
注意:
如果啟動後不是 successfully
,則是啟動失敗了。原因基本上就是配置檔案有問題。
通過程序來檢視服務是否啟動了:
[root@bobohost single]# ps -ef |grep mongod
root 90384 1 0 8月26 ? 00:02:13 /usr/local/mongdb/bin/mongod -f /mongodb/single/mongod.conf
- 分別使用mongo命令和compass工具來連線測試。
提示:如果遠端連線不上,需要配置防火牆放行,或直接關閉linux防火牆
#檢視防火牆狀態
systemctl status firewalld
#臨時關閉防火牆
systemctl stop firewalld
#開機禁止啟動防火牆
systemctl disable firewalld
- 停止關閉服務
停止服務的方式有兩種:快速關閉和標準關閉,下面依次說明:
(一)快速關閉方法(快速,簡單,資料可能會出錯)
目標:通過系統的kill命令直接殺死程序:
殺完要檢查一下,避免有的沒有殺掉。
#通過程序編號關閉節點
kill -2 54410
【補充】
如果一旦是因為資料損壞,則需要進行如下操作(瞭解):
- 刪除lock檔案:
rm -f /mongodb/single/data/db/*.lock
- 修復資料:
/usr/local/mongdb/bin/mongod --repair --dbpath=/mongodb/single/data/db
(二)標準的關閉方法(資料不容易出錯,但麻煩):
目標:通過mongo客戶端中的shutdownServer命令來關閉服務
主要的操作步驟參考如下:
//客戶端登入服務,注意,這裡通過localhost登入,如果需要遠端登入,必須先登入認證才行。
mongo --port 27017
//#切換到admin庫
use admin
//關閉服務
db.shutdownServer()
3 基本常用命令
3.1 案例需求
存放文章評論的資料存放到MongoDB中,資料結構參考如下:
資料庫:articledb
| 專欄文章評論 | comment | 1 | 2 |
| -------------- | ------- |
| 欄位名稱 | 欄位含義 | 欄位型別 | 備註 |
| _id | ID | ObjectId或String | Mongo的主鍵的欄位 |
| articleid | 文章ID | String |
| content | 評論內容 | String |
| userid | 評論人ID | String |
| nickname | 評論人暱稱 | String |
| createdatetime | 評論的日期時間 | Date |
| likenum | 點贊數 | Int32 |
| replynum | 回覆數 | Int32 |
| state | 狀態 | String | 0:不可見;1:可見 |
| parentid | 上級ID | String | 如果為0表示文章的頂級評論 |