iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
JavaScript

不要再說你不會後端!30 天 Node.js 降維打擊指南 系列 第 19 篇

Day 19:MongoDB 降維打擊 — 無綱要 (Schema-less) 的極速開發

  • 分享至 

  • xImage
  •  

昨天我們見識了 SQL 嚴謹的關聯設計。今天我們要徹底翻轉思維,進入 NoSQL 的霸主:MongoDB 的世界。

在關聯式資料庫中,資料是被強迫塞進二維的「表格 (Table)」裡。但在 MongoDB 中,資料是儲存為類似 JSON 格式的「文件 (Document)」。這種「無綱要 (Schema-less)」的特性,能帶來極具破壞力的開發速度。


1. 拋棄表格,擁抱 JSON 文件 (Document)

想像一下,你要儲存一個具備複雜資料結構的物件。例如,在開發帶有背包系統的遊戲時,角色的裝備欄位可能隨時擴充;或者在接收 ESP32 微控制器的感測器日誌時,每次傳回的資料維度可能都不太一樣。

如果用 SQL,你可能要開三四張表互相 JOIN;但用 MongoDB,你只需要存入一包完整的 JSON:

{
  "_id": "64b5f8e0d3f2a1b9c8d7e6f5",
  "name": "Bibo",
  "level": 42,
  "inventory": [
    { "item": "Health Potion", "qty": 5 },
    { "item": "Iron Sword", "durability": 85 }
  ],
  "sensor_logs": {
    "temperature": 28.5,
    "humidity": 60
  }
}

發現了嗎?陣列、巢狀物件,MongoDB 照單全收。這讓後端程式與資料庫之間的轉換阻力降到了最低。


2. MongoDB 雲端起步:Atlas

實務上我們不會在伺服器本機安裝 MongoDB。我們會使用官方的免費雲端服務:MongoDB Atlas。

環境準備步驟:

  1. 前往 MongoDB Atlas 註冊帳號。
  2. 建立一個免費的 M0 沙盒叢集 (Cluster)。
  3. 在 Database Access 頁面新增一組資料庫帳號密碼。
  4. 在 Network Access 頁面設定 0.0.0.0/0 (允許所有 IP 連線,開發期方便測試)。
  5. 點擊 "Connect" -> "Connect your application",複製那串長長的連線字串 (Connection String)。
    格式約為:mongodb+srv://<username>:<password>@cluster0.mongodb.net/?retryWrites=true&w=majority

3. Mongoose 登場:NoSQL 裡的溫柔秩序

雖然 MongoDB 允許你亂塞資料,但在正規的商業邏輯中,完全沒有限制反而會引發災難。因此,Node.js 社群最主流的做法是搭配 Mongoose 這個 ODM (Object Data Modeling) 套件。

Mongoose 能幫我們在「極度自由的 MongoDB」之上,套上一層「輕量級的防護網 (Schema)」。

實作練習:
在專案中安裝 Mongoose:
npm install mongoose

建立 mongo-demo.js:

import mongoose from 'express';

// 1. 連線至 MongoDB Atlas (請換成你自己的連線字串)
const uri = "mongodb+srv://<你的帳號>:<你的密碼>@cluster0.xxxx.mongodb.net/myGameDB?retryWrites=true&w=majority";

mongoose.connect(uri)
  .then(() => console.log(' 成功連線至 MongoDB Atlas!'))
  .catch(err => console.error(' 連線失敗:', err));

// 2. 定義 Schema (輕量防護網)
const playerSchema = new mongoose.Schema({
  name: { type: String, required: true },
  level: { type: Number, default: 1 },
  // 陣列與巢狀物件直接宣告
  inventory: [{
    item: String,
    qty: Number
  }]
});

// 3. 建立 Model (操作資料庫的實體)
const Player = mongoose.model('Player', playerSchema);

// 4. 測試新增資料
const createPlayer = async () => {
  try {
    const newPlayer = new Player({
      name: "Hero_01",
      level: 10,
      inventory: [
        { item: "Red Potion", qty: 3 }
      ]
    });
    
    // .save() 寫入雲端資料庫
    const result = await newPlayer.save();
    console.log(" 玩家資料已寫入:", result);
  } catch (error) {
    console.error(error.message);
  }
};

createPlayer();

這就是 NoSQL 的浪漫:沒有繁瑣的 Migration (資料庫遷移),沒有嚴格的表格 JOIN。定義好模型,資料就可以如同 JavaScript 物件般,行雲流水地進出雲端資料庫。


上一篇
#Day 18:打通任督二脈 — SQL 關聯設計 (一對多與多對多)
下一篇
# Day 20:MongoDB 聚合管道 (Aggregation Pipeline) 的數據煉金術
系列文
不要再說你不會後端!30 天 Node.js 降維打擊指南 共 20 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言