我們不是在捨棄 SQL,而是在設計一種語意上更自由、結構上更彈性的資料存取思維。
前面 12 章內容,我們已經從語言觀念進入 Node.js 的世界,學習了事件驅動、非同步流程、URL routing、WebSocket 與 Backbone.js 等技術,並跨足前端視角。這是一場從語言結構到界面邏輯的遞進過程。
接下來的第 13 章,將引導你踏入 NoSQL 資料層 —— 為整體開發流程補上最後一塊拼圖。完成本章後,你將具備完整的「Node.js 全端開發視野」。這不只是語法的學習,而是建立一套從資料儲存到應用語境的整體思維。
Node.js 不是一種語言,而是一種開發系統的心法,它串接 API,也設計資料,它驅動流程,也涵蓋架構。
MongoDB 所屬的 NoSQL 系列,其名雖為「Not Only SQL」,實則宣告了一場資料模型上的轉變:
- 不再以資料表為核心,而以 文件(Document) 為單位
- 資料格式採 JSON/BSON 儲存(key-value pair 結構)
- 不強調預先定義欄位(Schema-less 或 Flexible Schema)
- 支援分散式儲存與高併發讀寫操作
這不是結構的鬆散,而是結構的語境化 —— 每筆資料可攜帶自身語意,不被強迫納入預設欄位。
MongoDB 是最具代表性的文件式資料庫,核心特性包括:
- 資料儲存格式為 BSON(二進位 JSON)
- 每筆資料即一份文件,可含巢狀結構
- 不需定義固定 Schema,但支援 Schema 驗證
- 原生支援分片(Sharding)與複寫(Replication)
- 查詢語法接近 JSON 操作,更貼近程式語言的物件邏輯
這些特性,使它在以下場景大放異彩:
- 大數據分析:高彈性資料結構搭配水平擴展能力
- 即時應用程式(Real-time Web App):高併發下的穩定性
- 原型快速開發:開發早期無需強制定義資料結構
與傳統 SQL 資料庫的 ACID(Atomicity, Consistency, Isolation, Durability)模型相比,MongoDB 採取更寬容的 BASE(Basically Available, Soft state, Eventual consistency)原則。
這不代表放棄一致性,而是在追求擴展性與可用性時,讓一致性退居次要。
ACID 是保守的契約,BASE 是可擴散的信任。
MongoDB 支援所謂 flexible schema design —— 資料架構不是事前設計的模板,而是可以隨時調整的語意框架。這讓我們不再為某個資料欄位的改動大費周章。
從開發者角度來看,這代表什麼?
- 資料模型與應用程式可以同步演進
- 資料結構可因任務語意而異,不再統一硬式欄位
- 初期開發專案能更快啟動、調整、更具迭代速度
在後續章節中,我們將會實作 MongoDB 的基本操作,從連線、儲存、查詢到與 Node.js 的整合。真正開始之前,你要記得:
MongoDB 的核心不是資料儲存,而是語意封裝。
要理解 MongoDB 的價值,我們不只是看它「能存什麼」,而要看它「如何參與資料流程」。以下是幾個典型的 Node.js + MongoDB 應用場景,每一個,都展示了語意資料與事件驅動架構的交會點:
- Node.js 優勢:WebSocket 高效推送訊息,處理大量連線事件
- MongoDB 角色:儲存訊息紀錄、使用者資料、聊天室狀態(如是否已讀)
- 語意亮點:每則訊息是一份文件,可擴充欄位如附件、回覆關聯、貼圖等
- Node.js 優勢:快速處理 API 請求與訂單邏輯
- MongoDB 角色:產品資料(多規格、分類)、訂單記錄(多層巢狀結構)、用戶偏好
- 語意亮點:商品規格可動態調整、促銷欄位可隨時擴充,不需重構資料表
- Node.js 優勢:擔任語料清洗與標註流程中的事件中樞
- MongoDB 角色:儲存 Prompt 樣本、模型回應、錯誤標註、分類標籤
- 語意亮點:每筆語料攜帶語境、類型、回饋紀錄,可作為多維標註資料源
- Node.js 優勢:使用 Express + Socket.io 管理即時任務通知與變更事件
- MongoDB 角色:任務描述、成員指派、變更紀錄、標籤分類
- 語意亮點:任務結構自由(可有子任務、進度欄、歷史版本),文件型態最適化儲存方式
以上這些案例都指向同一個邏輯:
在 Node.js 的事件驅動架構裡,MongoDB 不是只是資料儲存,而是語意流的節點。