Day 1 - MongoDB 基礎


前言

近幾年 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 (資料格式) 可以使用
    • 如後續會提到的 ObjectIdRegular ExpressionTimestamp 等,都是 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 有一個名為 hellofield
    • hello 對應的值為 mongoDB,type 為 String
    • 同理,如果 myNewCollection1 不存在, MongoDB 會自動幫我們創建

沒錯!在 MongoDB 中創建資料就是這個簡單!

總結

MongoDB 強大的原因之一在於其 資料儲存的彈性
由於不需要事先定義 Schema,因此我們可以很輕易的加入修改資料!

下篇文章我們將介紹 MongoDB 的 C(創建)R(讀取)U(更新)D(刪除) 操作!敬請期待~

BitWise 分享

除了參與本次 寫作松 分享軟體開發的技術之外,
我在 Podcast 節目 【 BitWise 一點智慧 】 中也會以輕鬆的角度,跟大家聊聊軟體開發、設計、學習!歡迎大家收聽~~

👉 用Apple收聽
👉 用Spotify收聽
👉 用Google收聽
👉 官方網站

#mongoDB #Backend #Database
用七天的時間從新手變成高手!包含 MongoDB NoSQL 的特性、基本 CRUD 操作、複雜卻高效的 Aggregate 操作、提升查詢效能的 Index 建置等議題。






Related Posts

淺談 JavaScript 頭號難題 this:絕對不完整,但保證好懂

淺談 JavaScript 頭號難題 this:絕對不完整,但保證好懂

[01] 程式設計簡介 - 述句、運算式、運算子

[01] 程式設計簡介 - 述句、運算式、運算子

Day05 - Web API

Day05 - Web API



Sponsored



Comments