前言
近幾年 NoSQL 資料庫成為大家時常討論的技術主題,而 MongoDB 則是最廣為人知的開源 NoSQL 資料庫。
本篇文章架構如下,帶大家一虧究竟 MongoDB 的內在!
- MongoDB 架構:Collection 與 Document
- MongoDB 的資料儲存:什麼是 BSON?
- MongoDB 基礎語法:創建第一筆資料
網路上已有數篇 MongoDB 的安裝教學文,因此不在本系列文中贅述。
還沒有安裝 MongoDB 的朋友可以參考 官方安裝教學。
MongoDB 架構
Why NoSQL
若曾接觸過 SQL 的朋友,對於 SQL 中 Table(資料表)
、Column(欄)
的概念應該不陌生。在 SQL 中我們需要嚴格定義資料的 Schema(綱要)
,並確保每筆資料都遵循 Schema 的定義。
例如,當我們定義 User 資料表
包含了名字
、職業
、血型
三個欄位,則資料表中的每位 user 都必須不多不少的擁有這三個欄位。問題來了,如果今天我只想幫某個 user 加上 嗜好
這個欄位呢?
由於 SQL 中資料的形式必須遵守 Schema 定義,因此只能幫現有的所有 user 都加上 嗜好
這個新欄位,儘管大多 user 都沒有紀錄嗜好的需求!
面對上述的情境,NoSQL 的 MongoDB 就彈性許多。
MongoDB 中的 Collection
Collection
就是資料的集合。
Collection 概念好比 SQL 中的 Table。差別在於,我們不需要在 Collection 中定義任何資料的 Schema。也就是說,同一個 Collection 中可以存放 長相完全不一樣 的資料(雖然通常並不會這麼做)。
MongoDB 的特性就是
Schemaless
。
MongoDB 中的 Document
Document
是存放在 Collection 中的一筆資料。
在 MongoDB 的世界中,資料不像 SQL 般方方正正。相反的,Document 的形式就像 JSON
一般, 由多組 key-value
組成,且每筆 Document 的長相可以不同。
假如我們原先擁有兩筆描述 user 的 Document 長相如下:
// 以下是描述兩個 user 的 document
{
name: 'Suki',
job: 'backend developer',
bloodType: 'A'
},
{
name: 'Jam',
job: 'fullstack developer',
bloodType: 'A'
}
今天我們突然需要為其中一個 user 紀錄 嗜好
,只需要在該 user Document 中加入 嗜好
這個 field
就行!原先存在的其他 user 則完全不受影響。
// 為第一個 user 紀錄嗜好
{
// 加上嗜好欄位的 user
name: 'Suki',
job: 'backend developer',
bloodType: 'A'
hobbies: ['podcast', 'music']
},
{
// 不被影響
name: 'Jam',
job: 'fullstack developer',
bloodType: 'A'
}
由於 MongoDB 資料儲存的彈性高,因此適合用於資料格式易於變動
的應用中。
使用關聯式資料庫時,需要透過 Relation(JOIN)找出目標資料。
使用 MongoDB 時,有關聯的資料常常會被儲存在同一個 Document 中
。
MongoDB 的資料儲存
BSON
上面有提到,Document 的長相是如 JSON
一般的 key-value
組合。
實際 MongoDB 在儲存資料時,使用的是較特殊的 BSON
格式。
使用 BSON 的優點包含:
- 在
空間儲存
上較有效率 - 有更多
type (資料格式)
可以使用- 如後續會提到的
ObjectId
、Regular Expression
、Timestamp
等,都是 BSON 支援的格式 - BSON 支援的資料格式列表可以參考官方文件
- 如後續會提到的
豐富的 Document
在上面 user 的例子中,我們已經使用了String
來描述 名字
、職業
、血型
;並使用 Array
來紀錄 嗜好
。
實際上 BSON 支援的資料格式還有很多,這邊我們再舉一個包含多種 type 的 document 當作範例:
// 一個包含多種 type 的 document
{
_id: ObjectId("5099803df3f4948bd2f98391"), // MongoDB 中自帶的主鍵
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
MongoDB 基礎語法
我們來創建第一筆資料進 MongoDB 吧!
安裝好 MongoDB server 之後,我們需要 透過 shell 來對 DB 進行操作。
創建第一筆資料
由於 MongoDB 是 Schemaless
的資料庫,我們不需要向 SQL 一樣定義 Table 資料表
的長相。因此創建資料是一件非常容易的事情!
只需要輸入簡單的兩行指令即可:
use myNewDB
db.myNewCollection1.insertOne( { hello: 'mongoDB' } )
- 第一行
use myNewDB
表示我們要使用名為myNewDB
的 database- 如果
myNewDB
不存在,MongoDB 會自動幫我們創造 - 如果
myNewDB
已經存在,MongoDB 會幫我們切換到該 database 底下
- 如果
- 第二行
db.myNewCollection1.insertOne( { hello: 'mongoDB' } )
,代表我們要在名為myNewCollection1
這個Collection
中創建一筆Document
- 該 Document 有一個名為
hello
的field
hello
對應的值為mongoDB
,type 為String
- 同理,如果
myNewCollection1
不存在, MongoDB 會自動幫我們創建
- 該 Document 有一個名為
沒錯!在 MongoDB 中創建資料就是這個簡單!
總結
MongoDB 強大的原因之一在於其 資料儲存的彈性
。
由於不需要事先定義 Schema,因此我們可以很輕易的加入
、修改
資料!
下篇文章我們將介紹 MongoDB 的 C(創建)
、R(讀取)
、U(更新)
、D(刪除)
操作!敬請期待~
BitWise 分享
除了參與本次 寫作松
分享軟體開發的技術之外,
我在 Podcast 節目 【 BitWise 一點智慧 】
中也會以輕鬆的角度,跟大家聊聊軟體開發、設計、學習!歡迎大家收聽~~
👉 用Apple收聽
👉 用Spotify收聽
👉 用Google收聽
👉 官方網站