Day10 - MongoDB 與 Mongoose

MongoDB 與 Mongoose

前言

前一篇我們初步對於資料庫有了一點概念後,接下來當然要進入資料庫章節啦~

MongoDB?

什麼是 MongoDB 呢?其實 MongoDB 就是我們前一篇文章所介紹的 NoSQL 資料庫,而且前面也有提到 NoSQL 的資料格式類似於 JSON 格式。

但!!!是!!!!

MongoDB 其實真正的資料格式是 BSON,而不是 JSON,BSON 是 Binary JSON 的縮寫,是一種二進位的表示形式,因此比 JSON 更加節省空間,而且支援更多的資料型態。

舉例來講 JSON 格式只有以下

  • 物件(Object)
  • 陣列(Array)
  • 字串(String)
  • 數字(Number)
  • 布林值(Boolean)
  • 空值(null)

而 BSON 則多了以下

  • 日期(Date)
  • 二進位資料(Binary data)
  • 正規表示式(Regular expression)
  • JavaScript 代碼(JavaScript code)
  • ObjectId
  • 64 位元整數(64-bit integer)
  • 128 位元浮點數(128-bit floating point number)
  • Timestamp

…等等。

因此 BSON 又會被稱為是 JSON 的超集合(superset)。

BSON

那麼以上大概就是關於 MongoDB 的重點跟差異,接下來我們就來看看如何使用 MongoDB 吧!

MongoDB Atlas 註冊

這邊我就不說明本地端的 MongoDB 安裝方式,如果你想要在本地端運作的話,我相信你可以在網路上找到的,取而代之,我會以 MongoDB Atlas 來說明。

叫你去網路上自己 G

Note
如果你真的找不到本地端的安裝方式的話,你可以參考我先前寫的「(1)被迫吃芒果的前端工程師 - 認識 MongoDB 與安裝 MongoDB」文章;除非有人許願希望我寫一篇本地端安裝的文章,不然我應該不會寫了 XD。

MongoDB Atlas 是什麼呢?MongoDB Atlas 是由 MongoDB 官方所提供的雲端服務,你可以在上面建立一個 MongoDB 的資料庫,並且透過網路連線的方式來存取資料庫,實戰上來講,我們也比較常見將資料庫放在雲端平台上,當然這不會是絕對,還是會以專案需求為主。

這邊請你先點擊以下連結進入 MongoDB 的官網,並且註冊一個帳號。

https://account.mongodb.com/account/login

這邊我會推薦你使用 GitHub 帳號來註冊

註冊畫面

畢竟身為一名工程師,應該都會有 GitHub 帳號吧?

基本上你點了註冊後,應該會出現隱私權政策的頁面,你可以直接點選同意,然後就會進入到以下畫面

Welcome

這個畫面會稍微需要等一下,接著你應該會跳出它詢問幾個問題,底下我也提供我的選項給你參考

  • What is your goal today?
    • Learn MongoDB
    • Explore what I can build
    • Migrate an existing application
    • Build a new application
  • What type of application are you building?
    • I’m just exploring
  • What is your preferred language?
    • JavaScript

Welcome2

當然你也可以自己選擇,這邊我只是提供一個參考而已,接著你就會進入到以下畫面,也就是選擇你的方案(當然是選 Free 免費方案)

選擇方案

接下來你會進入到 Security Quickstart 畫面,在這邊你可以建立一個可以存取資料庫的使用者,這邊我會建立一個叫做 ithelp 的使用者,密碼就讓它隨機產生

Create User

Note
這組帳號密碼請務必保存好,因為之後我們會用到它。

按下建立使用者按鈕後,你應該會跳到「Where would you like to connect from?」區塊,這邊主要是填寫你要從哪裡連線到資料庫,因此我們要選「My Local Environment」

My Local Environment

接下來是「Add entries to your IP Access List」區塊,底下的 IP Address 跟 Description 幫我依照以下填寫並送出

  • IP Address
    • 0.0.0.0
  • Description
    • All Ips

All Ips

這一段 0.0.0.0 的意思是「全部的 IP 都可以連線到資料庫」,加入後你就可以按下「Finish and Close」按鈕,這樣你就可以進入到資料庫的畫面了

Note
預設 MongoDB 會在你建立資料庫時,自動幫你加入一個你電腦當前 IP 位址;設定為 0.0.0.0 主要是為了方便練習才這樣設定,實戰上並不會這樣做唷。

新增 MongoDB Atlas 資料庫

在 Overview 頁面你可以看到有三種方式可以新增資料

  • Add Data
  • Load Sample Data
  • Data Modeling Templates

Overview

那麼為了方便示範,我們就選擇「Load Sample Data」,這樣就會幫你篩入一些範例資料,載入過程會需要一點時間,載入完畢後,你應該會看到 Browse Collections 的按鈕,按下去後你就可以看到資料庫的內容了~

Browse Collections

只要你能看到上面的畫面,那麼我們 MongoDB Atlas 的設定就完成了,接下來我們就可以開始進行連線的設定了~

Mongoose

其實官方有提供一個「MongoDB Compass」的工具,這個工具可以幫你連線到 MongoDB Atlas,不過這邊我並不會介紹這個工具,而是會直接使用 Mongoose 來連線到 MongoDB Atlas。

Note
如果你想自己嘗試使用 MongoDB Compass 的話,你可以參考我這一篇文章「(28)被迫吃芒果的前端工程師 - Atlas - MongoDB Compass 教學」。

首先這邊請你輸入以下指令來建立新專案

1
mkdir example-mongoose
1
cd example-mongoose
1
npm init -y

接著請你安裝以下套件

1
npm i mongoose

安裝完畢後,我們先暫停一下,先讓我們認識一下 Mongoose 是什麼吧!

Mongoose 是什麼?

簡單來講 Mongoose 是一個 Node.js 的 ODM(Object Data Modeling),它可以幫助我們在 Node.js 中,更方便的操作 MongoDB 資料庫。

「難道不能直接使用 MongoDB 操作嗎?」

答案是可以的,但通常來講我們比較少會直接操作 MongoDB,而是會透過 ODM 來操作,透過 ODM 是可以降低開發與維護的成本,除非你很熟悉 MongoDB,否則會建議你還是使用 ODM。

那麼什麼是 ODM 呢?ODM 全名是 Object-Document Mapping(物件-文件映射),簡單來講就是將資料庫的文件映射到物件上,這樣就可以透過物件的方式來操作資料庫。

Note
另一個則是 ORM - Object-Relational Mapping(物件-關聯映射),這個是用來操作關聯式資料庫的,例如 MySQL、PostgreSQL 等等。

簡單來講 Mongoose 就是幫你整合了 MongoDB 的操作,讓你可以透過一些它封裝好的方法來操作資料庫,這樣就不用自己寫原生的 MongoDB 指令。

連線到 MongoDB Atlas

回到剛剛我們建立的專案(example-mongoose),我們先建立一個 index.js 檔案,並輸入以下程式碼

1
2
3
4
const mongoose = require('mongoose');

mongoose.connect('mongodb+srv://<帳號>:<密碼>@cluster0.zyfzacs.mongodb.net/?retryWrites=true&w=majority')
.then(() => console.log('Connected to MongoDB...'))

要注意沒有 <> 符號,因此以範例來講,會長這樣

1
2
3
4
const mongoose = require('mongoose');

mongoose.connect('mongodb+srv://example:[email protected]/?retryWrites=true&w=majority')
.then(() => console.log('Connected to MongoDB...'))

你只要把你剛剛在 MongoDB Atlas 建立的使用者帳號與密碼填入即可,填入後你就可以執行以下指令來測試連線

1
node index.js

當你有看到「Connected to MongoDB…」這個訊息,那麼恭喜你,你已經成功連線到 MongoDB Atlas 了!

ok,這邊其實有一個問題存在,也就是我寫的 mongoose.connect 字串並不適用於你,因為每個人都有連線字串,所以這邊該如何取得呢?請你到原本的 MongoDB Atlas 頁面,點選「Connect」

Connect

然後選擇「Drivers」

Drivers

接下來你滾到下方你就會看到一個連線字串,請你把它複製下來,並貼到 mongoose.connect 中,這樣就可以了~

Connect

那麼這一段連線字串是怎樣呢?別擔心,這邊我也來拆解說明一下。

連線字串

以我的範例來講,我的連線字串是長這樣

1
'mongodb+srv://example:<password>@cluster0.zyfzacs.mongodb.net/?retryWrites=true&w=majority'

其實這個連線字串是由幾個部分組成的,我們來一個一個拆解

  • mongodb+srv://:這是 MongoDB Atlas 的連線字串開頭,mongodb+srv 表示使用 MongoDB 的 SRV 連線格式,如果你使用的是 MongoDB 的舊版連線格式,那麼這邊就會是 mongodb://
  • example:這是你的使用者帳號,請把它替換成你的使用者帳號。
  • <password>:這是你的使用者密碼,請把它替換成你的使用者密碼。
  • cluster0.zyfzacs.mongodb.net:這是你的 MongoDB Atlas 位址,請把它替換成你的 MongoDB Atlas 位址。
  • ?retryWrites=true&w=majority:這是 MongoDB Atlas 的參數;retryWrites=true 意思是說當寫入失敗時,MongoDB Atlas 會自動重試;w=majority 意思是說當寫入成功時,MongoDB Atlas 會等待大部分的資料庫節點都寫入成功後才回應。

因此,當你要連線到 MongoDB Atlas 時,你只要把這幾個部分替換成你的資料即可。

1
'mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]'

當然 MongoDB 的連線字串還有很多參數,這邊我就不一一介紹了,如果你想要了解更多,可以參考 MongoDB 官方文件

啊,這一篇寫得有一點長了,所以這一篇先到這邊結束好了,我們下一篇見囉~

Note
如果你好奇 MongoDB 的基本操作跟語法的話,可以參考我先前寫的「被迫吃芒果的前端工程師」,後面章節我可能也不會每個語法都特別介紹,所以建議如果你不熟悉的話,可以考慮先閱讀一下。

碎碎念

去年其實就一直想說要寫 Node.js,結果今年要寫的時候就遇上公司的 Node.js 課程開班,結果一路忙到快開賽才準備要寫的內容,然後寫著寫著…怎麼那麼多 RRRRRRR