本系列文章也刊登在我的部落格中,如有更新將以部落格為主~
前言
近幾年非關聯式資料庫(NoSQL)
成為大家時常討論的技術主題,而 MongoDB 則是最廣為人知的開源 NoSQL 資料庫。
本篇文章是系列文的第一篇。架構如下:
- MongoDB 是什麼?
- MongoDB 的層級架構:
Database
、Collection
、Document
- MongoDB 的資料儲存:什麼是
BSON
? - 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 長相如下:
// 以下是兩筆 user 的 document
{
name: 'Suki',
job: 'backend developer',
bloodType: 'A'
},
{
name: 'Jam',
job: 'fullstack developer',
bloodType: 'A'
}
因為 MongoDB 的 schemeless 特性,當我們突然想為其中一個 user 紀錄嗜好,只需要在那個 user 的 document 中加入「嗜好」這個新欄位就行,其他 user 完全不受影響。
// 為第二位 user 紀錄嗜好
{
// 其他 user 不被影響
name: 'Suki',
job: 'backend developer',
bloodType: 'A'
},
{
// 加上 hobbbies 紀錄 user 的嗜好
name: 'Jam',
job: 'fullstack developer',
bloodType: 'A',
hobbies: ['hiking', 'podcast', 'sleeping']
}
使用 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 當作範例:
// 一個包含多種資料格式 的 document
{
_id: ObjectId("5099803df3f4948bd2f98391"), // _id 屬性是 ObjectId,常作為主鍵
name: { first: "Alan", last: "Turing" }, // name 屬性是 object
birth: new Date('Jun 23, 1912'), // bitrh 屬性是日期
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
MongoDB 基礎語法
網路上已有數篇 MongoDB 的安裝教學文,因此不在本系列文中贅述。
還沒有安裝 MongoDB 話可以參考官方安裝教學。
來嘗試創建資料進 MongoDB 吧!
我們可以透過不同程式語言對 server 進行操作。這邊示範透過 shell 進行操作。
創建第一筆資料
由於 MongoDB 是 Schemaless 資料庫、不需要事先定義資料表欄位,因此創建資料非常容易。
只需要輸入簡單的兩行指令即可:
use myNewDB
db.posts.insertOne( { title: 'hello mongoDB', author: 'suki' } )
- 第一行指令:指定使用名為
myNewDB
的 database- 如果
myNewDB
不存在,MongoDB 會自動幫我們創造 - 如果
myNewDB
已經存在,MongoDB 會切換到該 database 底下
- 如果
- 第二行指令:在名為
posts
的 collection 中創建一筆 document- 該 document 有 title 跟 author 兩個欄位
- 同理,如果
posts
不存在, MongoDB 會自動幫我們創建
沒錯!透過 MongoDB 創建資料就是這麼簡單!ヽ(✿゚▽゚)ノ
總結
MongoDB 強大的原因之一在於資料儲存的彈性。
由於不需要定義 Schema,因此可以很輕易的加入、修改資料,對於資料格式時常變動的應用非常友善。
下篇文章我們將介紹 MongoDB 的C(創建)
、R(讀取)
、U(更新)
、D(刪除)
操作~
BitWise 分享
除了參與本次 寫作松
分享軟體開發的技術之外,
我在 Podcast 節目 【 BitWise 一點智慧 】
中也會以輕鬆的角度,跟大家聊聊軟體開發、設計、學習!歡迎大家收聽~~
👉 用Apple收聽
👉 用Spotify收聽
👉 用Google收聽
👉 官方網站