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 的数据存储与操作了!