MongoDB 是一種流行的文檔型數據庫,它以 JSON 風格的文檔(BSON)作爲數據存儲單元。與關係型數據庫(如 MySQL)用表格和固定列不同,MongoDB 的每個文檔可以有自己獨特的字段,而且字段類型也很靈活。但這並不意味着“隨便定義”就好,理解和正確使用 MongoDB 的基礎數據類型,是設計高效、易維護的數據結構的關鍵。今天我們就來聊聊 MongoDB 中必須知道的基礎字段類型,幫助你打好數據設計的基礎。
MongoDB 的核心優勢之一是“動態結構”,即不同文檔可以有不同的字段,同一字段在不同文檔中甚至可以存儲不同類型的數據(但不建議)。不過,合理選擇字段類型能讓數據更易管理、查詢更快、索引更有效。
常用基礎數據類型¶
1. 字符串(String)¶
字符串類型用於存儲文本數據,如姓名、郵箱、地址等,使用 UTF-8 編碼。MongoDB 中用雙引號包裹字符串。
例子:
{
"name": "張三", // 存儲姓名(字符串類型)
"email": "zhangsan@example.com" // 存儲郵箱地址
}
注意:如果需要存儲 ID 類數字(如用戶 ID),雖然可以用字符串,但更推薦用整數類型(如 Int32/Int64),因爲整數排序和比較更高效。
2. 整數(Int32、Int64)¶
MongoDB 提供專門的整數類型,分爲 32 位(Int32)和 64 位(Int64),用於存儲非小數的整數值。
例子:
{
"age": 25, // Int32 類型(默認整數類型)
"user_id": NumberInt("10001"), // 顯式指定 Int32 類型
"order_id": NumberLong("1234567890123456789") // 顯式指定 Int64 類型
}
注意:如果直接寫數字(如 25),MongoDB 默認會存儲爲雙精度浮點數(類似 JavaScript 的 Number)。但整數運算建議用專門的整數類型,避免精度丟失。
3. 布爾值(Boolean)¶
布爾值只有 true 或 false 兩種取值,用於表示“是/否”“存在/不存在”等邏輯判斷。
例子:
{
"isActive": true, // 用戶是否活躍
"hasPaid": false // 是否已付款
}
4. 日期(Date)¶
日期類型用於存儲時間信息,MongoDB 中以 UTC 時間(協調世界時)存儲,精確到毫秒,內部用自 1970 年 1 月 1 日 00:00:00 UTC 開始的毫秒數表示。
例子:
{
"createdAt": new Date("2023-01-15T08:30:00Z"), // 顯式創建日期
"updatedAt": ISODate("2023-02-20T14:45:00Z") // 另一種寫法
}
注意:日期類型不能用字符串存儲(除非手動轉換),必須用 MongoDB 的 Date 類型,這樣才能使用日期操作符(如 $dateAdd、$expr)。
5. 數組(Array)¶
數組類型用於存儲有序的列表數據,數組中的元素可以是任意類型(字符串、數字、對象等),甚至嵌套數組。
例子:
{
"hobbies": ["reading", "coding", "hiking"], // 字符串數組
"scores": [90, 85, 95], // 數字數組
"addresses": [ // 嵌套對象數組
{ "city": "Beijing", "zip": "100000" },
{ "city": "Shanghai", "zip": "200000" }
]
}
注意:數組長度可動態變化,支持 $push、$pull 等數組操作符,但複雜數組可能需要更復雜的過濾條件。
6. 文檔/對象(Document/Object)¶
MongoDB 支持嵌套文檔(類似 JSON 對象),一個字段的值本身又是一個文檔,用於表示複雜結構化數據。
例子:
{
"user": { // 嵌套文檔
"name": "李四",
"age": 30,
"contact": { // 嵌套更深一層
"phone": "13800138000",
"email": "lisi@example.com"
}
},
"tags": { "type": "user", "status": "active" } // 簡單對象
}
注意:嵌套文檔避免過深(建議不超過 3 層),否則影響查詢效率。頻繁查詢嵌套字段時,可考慮用關係型數據庫關聯表。
7. 空值(Null)¶
null 表示字段的值爲空或不存在,與“未定義”不同,null 是明確的空值。
例子:
{
"address": null, // 地址字段爲空
"lastLogin": null // 最後登錄時間爲空
}
注意:null 是字段存在但值爲空,而無該字段({} 中無該鍵)表示字段不存在,兩者需區分。
8. 其他基礎類型¶
- ObjectId:每個文檔默認包含
_id字段,類型爲 ObjectId,用於唯一標識文檔,包含時間戳和機器標識,不可重複。 - 二進制數據(Binary Data):存儲二進制數據(如圖片),小數據可用 Binary 類型,大文件建議用 GridFS。
- 正則表達式(Regex):存儲正則表達式對象,用於字符串匹配查詢(如
{ "name": { $regex: "^張" } })。
字段類型的最佳實踐¶
- 類型一致性:同一字段在所有文檔中保持相同類型(如
age始終存整數,不混用字符串),否則影響查詢和索引。 - 明確數值類型:用
Int32/Int64存數字,Date存時間,避免隱式轉換。 - 避免過度嵌套:嵌套文檔過深會增加查詢複雜度,可拆分爲獨立字段或用關係型表。
- 索引字段優先數值/日期:對索引字段選整數或日期類型,字符串索引效率較低。
總結¶
MongoDB 的字段類型是數據模型設計的核心,理解並正確選擇類型(字符串、整數、布爾、日期、數組、對象等)能讓數據更清晰、查詢更高效。記住:類型的選擇需結合業務場景,保持一致性和簡潔性是關鍵。掌握這些基礎後,你就能更好地應對 MongoDB 的數據存儲與操作了!