近幾年非關聯式資料庫(NoSQL)
成為大家時常討論的技術主題,而 MongoDB 則是最廣為人知的開源 NoSQL 資料庫。
本篇文章是系列文新手到進階學 MongoDB 的第一篇。架構如下:
- MongoDB 是什麼?
- MongoDB 的層級架構:
Database
、Collection
、Document
- MongoDB 的資料儲存:什麼是
BSON
? - MongoDB 基礎語法:創建第一筆資料
MongoDB 是什麼?
在 MongoDB 的官方文件裡開宗明義的寫了:
MongoDB is a document database designed for ease of development and scaling.
由這句話我們可以看出:
- MongoDB 是一個由
document
為主的 database - MongoDB 的優點是
易於開發、擴展
我們先來談談為什麼 mongoDB 有易於開發
的優點,以及為什麼近幾年很多新創都會選擇使用 MongoDB。
為什麼 MongoDB 易於開發?
若曾經接觸過關聯式資料庫(Relational database/SQL 資料庫)
,應該對於Schema(綱要)
的概念不陌生。在關聯式資料庫中我們必須事先定義好 Schema(也就是每張Table(資料表)
中包含哪些Column(欄)
),並確保每筆儲存的Row(資料)
都遵循 schema 的定義。
例如我們想要在 SQL 資料庫中紀錄有關user
的相關資訊,如果最初定義User 資料表
的 schema 有名字、職業、血型三個欄位,則資料表中的每筆資料(也就是每位 user)都必須「不多不少」的擁有這三個欄位。問題來了,如果今天我只想幫其中一個 user 紀錄嗜好呢?
由於 SQL 資料庫必須遵守 schema 定義,因此必須要:
- 先更動 schema,在 schema 加上嗜好欄位
- 寫個腳本幫現有的所有 user 都填上嗜好(不知道嗜好的 user 就填入空值)
是不是挺麻煩的?面對上述的情境,NoSQL
的 MongoDB 就彈性許多。
因為 MongoDB 不需要定義 Schema,可以大幅縮短開發時間,也很適合用於資料格式常變動的新創應用中。我們稱 MongoDB 的特性是
Schemaless
。
MongoDB 的層級架構
再來談談 MongoDB 世界的層級觀念,分別由大而小是Database
、Collection
與Document
。
Database
在一個 MongoDB 伺服器中通常會有一至多個Database
。通常將不同的應用放在不同 database 中。
例如某家公司同時擁有產品 A 跟產品 B,且兩個產品資料是不相通的,那就可以在 MongoDB 中建立兩個 database,分別儲存兩個產品的資料。
Collection
Collection
就是資料表,概念好比關聯式資料庫的 Table。通常一個 databse 中會有數個 collection。
例如針對產品 A,我們可能會想紀錄「購買人資訊」、「製造商資訊」、「販售地點」…等等,因此可以在「產品 A 的 database」 中分別開設對應的 collection。
Document
Document
就是一筆資料,概念好比關聯式資料庫的 Row。通常一個 collection 中會有數筆 document。也因此我們稱 MongoDB 是 document database
。
例如在「購買人資訊」的 collection 中,真正的一筆「購買人資訊」就是一個 document。
層級架構圖
MongoDB 的資料儲存
Document 的長相
其實 Document 就長得像 JSON 一樣, 由多組 key-value
組成。
假如有兩筆描述 user 的 document 長相如下:
1 | // 以下是兩筆 user 的 document |
因為 MongoDB 的 schemeless 特性,當我們突然想為其中一個 user 紀錄嗜好,只需要在那個 user 的 document 中加入「嗜好」這個新欄位就行,其他 user 完全不受影響。
1 | // 為第二位 user 紀錄嗜好 |
使用 NoSQL 資料庫時,有關聯的資料常常會被儲存在同一個 document 中。
BSON
上面有提到,每筆 document 的長相是如 JSON 格式的 key-value 組合。
實際 MongoDB 在儲存資料時,使用的是較特殊的BSON
格式。(BSON 是 JSON 的二進位表示形式)
使用 BSON 的優點包含:
- 在空間儲存上較有效率
- 有更多
type(資料格式)
可以使用:- 如
ObjectId
、Regular Expression
、Timestamp
等,都是 BSON 支援的格式 - BSON 支援的資料格式列表可以參考官方文件
- 如
上面 user 的例子裡使用了String
來描述名字、職業、血型;並使用 Array
來紀錄嗜好。
實際上 BSON 支援的 type 有很多,這邊我們再舉一個包含多種 type 的 document 當作範例:
1 | // 一個包含多種資料格式 的 document |
MongoDB 基礎語法
網路上已有數篇 MongoDB 的安裝教學文,因此不在本系列文中贅述。
還沒有安裝 MongoDB 話可以參考官方安裝教學。
來嘗試創建資料進 MongoDB 吧!
我們可以透過不同程式語言對 server 進行操作。這邊示範透過 shell 進行操作。
創建第一筆資料
由於 MongoDB 是 Schemaless 資料庫、不需要事先定義資料表欄位,因此創建資料非常容易。
只需要輸入簡單的兩行指令即可:
1 | use myNewDB |
- 第一行指令:指定使用名為
myNewDB
的 database- 如果
myNewDB
不存在,MongoDB 會自動幫我們創造 - 如果
myNewDB
已經存在,MongoDB 會切換到該 database 底下
- 如果
- 第二行指令:在名為
posts
的 collection 中創建一筆 document- 該 document 有 title 跟 author 兩個欄位
- 同理,如果
posts
不存在, MongoDB 會自動幫我們創建
沒錯!透過 MongoDB 創建資料就是這麼簡單!ヽ(✿゚▽゚)ノ
總結
MongoDB 強大的原因之一在於資料儲存的彈性。
由於不需要定義 Schema,因此可以很輕易的加入、修改資料,對於資料格式時常變動的應用非常友善。
下篇文章我們將介紹 MongoDB 的C(創建)
、R(讀取)
、U(更新)
、D(刪除)
操作~
後記
由於工作上常使用 MongoDB,原本想趁著 CoderBridge 在 2020 年舉辦的「開發者寫作松」紀錄一下 MongoDB 的基礎到進階用法,但只寫了兩篇就偷懶症發作 (´゚д゚`)
趁著最近經營部落格的計劃死灰復燃,再次挑戰完成本系列教學文 ~
本文章最初刊載在 CoderBridge:7 天新手到進階學 MongoDB 系列文中。
評論