1. 程式人生 > 其它 >Mongodb快速上手(未完成,持續更新中)

Mongodb快速上手(未完成,持續更新中)

1. MongoDB相關概念

1.1 業務應用場景

傳統的關係型資料庫(如MySQL),在資料操作的“三高”需求以及應對Web2.0的網站需求面前,顯得力不從心。

解釋:“三高”需求:

  • High performance - 對資料庫高併發讀寫的需求。
  • Huge Storage - 對海量資料的高效率儲存和訪問的需求。
  • High Scalability && High Availability- 對資料庫的高可擴充套件性和高可用性的需求。

而MongoDB可應對“三高”需求。

具體的應用場景如:

  1. 社交場景,使用 MongoDB 儲存儲存使用者資訊,以及使用者發表的朋友圈資訊,通過地理位置索引實現附近的人、地點等功能。
  2. 遊戲場景,使用 MongoDB 儲存遊戲使用者資訊,使用者的裝備、積分等直接以內嵌文件的形式儲存,方便查詢、高效率儲存和訪問。
  3. 物流場景,使用 MongoDB 儲存訂單資訊,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌陣列的形式來儲存,一次查詢就能將
    訂單所有的變更讀取出來。
  4. 物聯網場景,使用 MongoDB 儲存所有接入的智慧裝置資訊,以及裝置彙報的日誌資訊,並對這些資訊進行多維度的分析。
  5. 視訊直播,使用 MongoDB 儲存使用者資訊、點贊互動資訊等。

這些應用場景中,資料操作方面的共同特點是:

  1. 資料量大
  2. 寫入操作頻繁(讀寫都很頻繁)
  3. 價值較低的資料,對事務性要求不高
    對於這樣的資料,我們更適合使用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主要有如下特點:

  1. 高效能:
    MongoDB提供高效能的資料永續性。特別是,對嵌入式資料模型的支援減少了資料庫系統上的I/O活動。
    索引支援更快的查詢,並且可以包含來自嵌入式文件和陣列的鍵。(文字索引解決搜尋的需求、TTL索引解決歷史資料自動過期的需求、地理位置索引可用於構建各種 O2O 應用)
    mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支援滿足各種場景需求。
    Gridfs解決檔案儲存的需求。
  2. 高可用性:
    MongoDB的複製工具稱為副本集(replica set),它可提供自動故障轉移和資料冗餘。
  3. 高擴充套件性:
    MongoDB提供了水平可擴充套件性作為其核心功能的一部分。
    分片將資料分佈在一組叢集的機器上。(海量資料儲存,服務能力水平擴充套件)
    從3.4開始,MongoDB支援基於片鍵建立資料區域。在一個平衡的叢集中,MongoDB將一個區域所覆蓋的讀寫只定向到該區域內的那些
    片。
  4. 豐富的查詢支援:
    MongoDB支援豐富的查詢語言,支援讀和寫操作(CRUD),比如資料聚合、文字搜尋和地理空間查詢等。
  5. 其他特點:如無模式(動態模式)、靈活的文件模型、

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/

【注意】

  1. 配置檔案中如果使用雙引號,比如路徑地址,自動會將雙引號的內容轉義。如果不轉義,則會報錯:

error-parsing-yaml-config-file-yaml-cpp-error-at-line-3-column-15-unknown-escape-character-d

解決:
a. 對 \ 換成 / 或 \
b. 如果路徑中沒有空格,則無需加引號。

  1. 配置檔案中不能以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下操作差不多。

步驟如下:

  1. 先到官網下載壓縮包 mongod-linux-x86_64-4.0.10.tgz 。
  2. 上傳壓縮包到Linux中,解壓到當前目錄:
    tar -xvf mongodb-linux-x86_64-4.0.10.tgz
  3. 移動解壓後的資料夾到指定的目錄中:
    mv mongodb-linux-x86_64-4.0.10 /usr/local/mongodb
  4. 新建幾個目錄,分別用來儲存資料和日誌:
#資料儲存目錄
mkdir -p /mongodb/single/data/db
#日誌儲存目錄
mkdir -p /mongodb/single/log
  1. 新建並修改配置檔案
    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
  1. 啟動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
  1. 分別使用mongo命令和compass工具來連線測試。
    提示:如果遠端連線不上,需要配置防火牆放行,或直接關閉linux防火牆
#檢視防火牆狀態
systemctl status firewalld
#臨時關閉防火牆
systemctl stop firewalld
#開機禁止啟動防火牆
systemctl disable firewalld
  1. 停止關閉服務
    停止服務的方式有兩種:快速關閉和標準關閉,下面依次說明:
    (一)快速關閉方法(快速,簡單,資料可能會出錯)
    目標:通過系統的kill命令直接殺死程序:
    殺完要檢查一下,避免有的沒有殺掉。
#通過程序編號關閉節點
kill -2 54410

【補充】
如果一旦是因為資料損壞,則需要進行如下操作(瞭解):

  1. 刪除lock檔案:
    rm -f /mongodb/single/data/db/*.lock
  2. 修復資料:
    /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表示文章的頂級評論 |