iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
2
Modern Web

30天使用Node.js在AWS上開發後端系列 第 4

30-4 Node.js開發後台之會員相關規劃

現在要開始一些比較枯燥的地方了
要規劃會員系統免不了要稍微講解資料庫

其實資料庫可以很簡單的想成是一個圖書館
裡面存放的資料可以想成是圖書館的書

如果要快速可以找到書(資料), 一定要為書(資料)建立對應的區域(對應表)
要在對應的區域可以快速找到書, 我們需要建立對應表(索引)

資料庫就是這樣
要可以把資料新增/刪除/查詢/修改/建立索引

接下來稍微分析一下一個會員大概需要什麼

可以從上圖看到會員大概需要帳號, 姓名, 文章數, 追蹤與被追蹤人數
但是有些是在其他地方用得到的, 所以簡單歸納幾個

  1. 帳號名稱
  2. 姓名
  3. 文章數
  4. 追蹤人數
  5. 被追蹤人數
  6. 信箱
  7. 是否公開個人頁
{
  "_id": "111",           // id
  "account": "neil123",   // 帳號
  "email": "n@abc.com",   // 信箱
  "name": "Neil",         // 姓名
  "articleCount": 0,      // 文章數
  "followedCount": 0,     // 被追蹤數
  "followCount": 10,       // 追蹤數
  "permission": "private" // 貼文權限
}

以上是大概規劃出一個會員的結構
結構就是所謂的schema!

稍微介紹一下MongoDB的用法
MongoDB主要有幾個比較需要知道的

  • collection
    • 資料庫的表, 也就是MySQL的table
    • 也就是書被放在的地方
  • document
    • 每筆存在collection內的資料
    • 也就是圖書館裡面的每一本書

簡單介紹幾個常用的MongoDB指令

  • 新增
    • insertOne => 新增一筆資料
    • insertMany => 新增多筆資料
  • 刪除
    • remove => 移除資料
  • 查詢
    • findOne => 找尋一筆資料
    • find => 找尋多筆資料
  • 修改
    • updateOne => 更新一筆資料
    • updateMany => 更新多筆資料

用程式碼來說明應該更快
以下連接MongoDB, 是使用 MongoDB Native Driver, 也就是MongoDB公司自己出的函式庫
專門讓Node.js跟MongoDB可以連接的函式庫!

// 這個地方之後會詳細解說
// 只要先把db這個物件當成是MongoDB就好了
const db = require('./models');

// 將userData這個變數存放用戶資料(物件)
// 此處不需要_id是因為, _id是你將物件存入MongoDB後, 會自動產生的
let userData = {
  "account": "neil123",   // 帳號
  "email": "n@abc.com",   // 信箱
  "name": "Neil",         // 姓名
  "articleCount": 0,      // 文章數
  "followedCount": 0,     // 被追蹤數
  "followCount": 10,       // 追蹤數
  "permission": "private" // 貼文權限
};

// db.collection('user')的意思就是在這個MongoDB內的user表格
// await是Javascript內的一個超級棒的關鍵字, 之後會跟 promise/callback一起講
// 可以先不用在意這個await
// 由此可以很直覺地看出, 底下這行是將user表格中, 插入了一筆資料
await db.collection('user').insertOne(userData);

// 這時候把剛剛塞進去的資料抓出來
// { name: 'Neil' }是查詢條件
// 意思就是幫我從MongoDB內找一個欄位name, 值是Neil字串的資料出來
// findOne是只找一筆資料
// 此時的user會自帶一個_id (ex: ObjectId('59e9d41a9eb2f56e5a220bea'))
// ObjectId是MongoDB預設存放_id的格式
// _id可以想像成是每本書的編號一般的存在
let user = await db.collection('user').findOne({ name: 'Neil' });

// 因為已經有user的編號, 直接針對編號去做修改, 效能會是最好的!
// 另外只要是更新某資料部分的欄位, 第二個參數務必要有 $set
// 更新的傳入參數 update(查詢條件, 要更改的部分)
// 查詢條件可以想像成符合這個條件的都要被更新, 但是因為用了 updateOne
// 所以只會更新一筆!
// $set裡面物件的key值(在此處為name)是資料需要被修改的欄位
// 值(此處是NeilWang字串)是要修改的最新的值
await db.collection('user').updateOne({
  _id: ObjectId('59e9d41a9eb2f56e5a220bea')
}, {
  $set: {
    name: 'NeilWang'
  }
});

// 刪除資料庫內所有name是NeilWang字串的資料
await db.collection('user').remove({ name: 'NeilWang' });

如果有點似懂非懂的
我超級推薦去看馬克大大的系列文


其實後端大部分的工作就是新增刪除查詢修改資料庫 (簡單看起來是這樣)
所以看完範例程式碼, 應該沒有想像中困難吧!
明天就是要準備把這些轉成更詳細的程式碼
絕大部分會是用程式碼來講解
我覺得與其抽象的去想像, 不如直接從程式碼看著學最快!
如果有哪部分看不懂的, 歡迎留言, 我會再努力修改
畢竟我還是希望這是給有興趣入門但是非本科系的人看!
感謝 <(_ _)>


30天要學這麼多肯定會很辛苦的
所以如果有時間, 真心希望去看馬克大大的MongoDB好文
我主要的重心都還是放在比較從程式碼去教學
不會講太多細部的東西

下一篇會介紹如何使用Node.js老牌的框架- Express
並且利用 Express Generator 產生專案
並且將資料庫的部分整合進去專案中
到時候會把code放上github
註: github是目前最多人用的線上版本控制的軟體原始碼代管服務


上一篇
30-3 使用Node.js開發一個類似Instagram的後台吧(架構篇)
下一篇
30-5 Node.js起手式之專案建立與資料庫串接 (1)
系列文
30天使用Node.js在AWS上開發後端6

尚未有邦友留言

立即登入留言