MongoDB 入門核心概念:文件模型、BSON、邏輯結構、_id 主鍵與分散式部署
MongoDB 以 C++ 開發,定位於介於關聯式與非關聯式之間,提供可擴展的高效能文件儲存。本文系統整理核心概念、資料模型、邏輯結構對照關聯式術語、_id 主鍵特性與部署建議。
一、定位與特性
- 文件導向:資料以 BSON (Binary JSON) 文件儲存,結構鬆散,支援巢狀文件、陣列。
- 無模式:同一集合內文件結構可不同,極靈活。
- 強大查詢:語法近似物件查詢,支援索引、聚合管線、地理空間、文字搜尋。
- 高可用:副本集自動故障轉移。
- 水平擴展:分片叢集自動分散資料。
- 多語言驅動:Java、Python、Node.js、Go、C#、PHP、Ruby 等。
二、邏輯結構三層對照
| MongoDB | 關聯式資料庫 | 說明 |
| Database | Database | 邏輯容器,一個實例可含多個 DB |
| Collection | Table | 文件群組,無 Schema 限制 |
| Document | Row | 鍵值對集合,對應一筆記錄 |
一個實例 → 多個 Database → 多個 Collection → 多個 Document。
三、_id 主鍵特性
- 每個文件**必須**有
_id,缺失時驅動程式自動產生 ObjectId(12 位元組:時間戳+機器碼+進程碼+計數器)。
_id 型別不限,可為 ObjectId、字串、數值、UUID 等,但**不可為陣列**。
- 分散式架構下**不支援自增整數主鍵**(無中央協調器),ObjectId 保證全域唯一且粗略有序。
- 關聯式習慣用
BIGINT AUTO_INCREMENT,MongoDB 需改變思維接受 ObjectId 或自行維護全域唯一 ID(如 Snowflake 演算法)。
四、BSON 資料型別補充
| BSON 型別 | 對應 JSON/說明 |
| Double | 浮點數 |
| String | UTF-8 字串 |
| Document | 巢狀文件 |
| Array | 陣列 |
| Binary | 二進位資料 |
| ObjectId | 12 位元組唯一識別碼 |
| Boolean | true/false |
| Date | UTC 毫秒時間戳 |
| Null | null |
| Regex | 正則運算式 |
| JavaScript | JS 代碼 |
| Symbol | 符號 |
| JavaScript (with scope) | JS 代碼含作用域 |
| 32-bit/64-bit Integer | 整數 |
| Timestamp | 內部時間戳 |
| MinKey/MaxKey | 比較邊界值 |
五、分散式檔案系統背景
MongoDB 可建立於分散式檔案系統(如 HDFS、ZDFS、GFS)之上,透過網路掛載儲存節點,實現計算與儲存分離、彈性擴容。生產部署常見架構:
- 副本集:3-5 節點,一主多從,自動故障轉移。
- 分片叢集:Mongos 路由 + Config Server + 多 Shard(各為副本集)。
- 雲原生:Kubernetes Operator (MongoDB Enterprise Operator / Community Operator) 管理副本集與分片。
六、部署建議
- 64 位元作業系統:32 位元限制單檔 2GB,嚴重限制資料量。
- 檔案系統:XFS/EXT4,關閉
atime,啟用 noatime 掛載參數。
- 透明大頁 (THP):關閉 (
echo never > /sys/kernel/mm/transparent_hugepage/enabled),避免延遲尖峰。
- ulimit:
ulimit -n 64000、ulimit -u 64000。
- NTP 時間同步:節點間時間差 < 1 秒,否則副本集選舉異常。
- 上一篇文章: mydumper 安裝、編譯錯誤排查與使用指南:多線程邏輯備份利器
- 下一篇文章: JasperReports 計算期初餘額:結合 esProc 實現跨行運算的高效方案
Copyright ©
程式碼之家 All Rights Reserved