想像一下,你要儲存一個具備複雜資料結構的物件。例如,在開發帶有背包系統的遊戲時,角色的裝備欄位可能隨時擴充;或者在接收 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 照單全收。這讓後端程式與資料庫之間的轉換阻力降到了最低。
實務上我們不會在伺服器本機安裝 MongoDB。我們會使用官方的免費雲端服務:MongoDB Atlas。
環境準備步驟:
0.0.0.0/0 (允許所有 IP 連線,開發期方便測試)。mongodb+srv://<username>:<password>@cluster0.mongodb.net/?retryWrites=true&w=majority
雖然 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 物件般,行雲流水地進出雲端資料庫。