Day 1 - MongoDB 基礎概念教學


本系列文章也刊登在我的部落格中,如有更新將以部落格為主~

前言

近幾年非關聯式資料庫(NoSQL)成為大家時常討論的技術主題,而 MongoDB 則是最廣為人知的開源 NoSQL 資料庫。

本篇文章是系列文的第一篇。架構如下:

  1. MongoDB 是什麼?
  2. MongoDB 的層級架構:DatabaseCollectionDocument
  3. MongoDB 的資料儲存:什麼是BSON
  4. MongoDB 基礎語法:創建第一筆資料

在 MongoDB 的官方文件裡開宗明義的寫了:

MongoDB is a document database designed for ease of development and scaling.

由這句話我們可以看出:

  1. MongoDB 是一個由document為主的 database
  2. MongoDB 的優點是易於開發、擴展

我們先來談談為什麼 mongoDB 有易於開發的優點,以及為什麼近幾年很多新創都會選擇使用 MongoDB

為什麼 MongoDB 易於開發?

若曾經接觸過關聯式資料庫(Relational database/SQL 資料庫),應該對於Schema(綱要)的概念不陌生。在關聯式資料庫中我們必須事先定義好 Schema(也就是每張Table(資料表)中包含哪些Column(欄)),並確保每筆儲存的Row(資料)都遵循 schema 的定義。

例如我們想要在 SQL 資料庫中紀錄有關user的相關資訊,如果最初定義User 資料表的 schema 有名字、職業、血型三個欄位,則資料表中的每筆資料(也就是每位 user)都必須「不多不少」的擁有這三個欄位。問題來了,如果今天我只想幫其中一個 user 紀錄嗜好呢?

由於 SQL 資料庫必須遵守 schema 定義,因此必須要:

  1. 先更動 schema,在 schema 加上嗜好欄位
  2. 寫個腳本幫現有的所有 user 都填上嗜好(不知道嗜好的 user 就填入空值)

是不是挺麻煩的?面對上述的情境,NoSQL的 MongoDB 就彈性許多。

因為 MongoDB 不需要定義 Schema,可以大幅縮短開發時間,也很適合用於資料格式常變動的新創應用中。我們稱 MongoDB 的特性是Schemaless

MongoDB 的層級架構

再來談談 MongoDB 世界的層級觀念,分別由大而小是DatabaseCollectionDocument

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 的優點包含:

  1. 在空間儲存上較有效率
  2. 有更多type(資料格式) 可以使用:如ObjectIdRegular ExpressionTimestamp等,都是 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收聽
👉 官方網站

#mongoDB #Backend #Database







你可能感興趣的文章

Day 125-126

Day 125-126

Hacktoberfest 2020 參與心得分享

Hacktoberfest 2020 參與心得分享

什麼是 Pure Function?在 React 當中的重要性是什麼?

什麼是 Pure Function?在 React 當中的重要性是什麼?






留言討論