MongoDB 支持哪些数据类型?
MongoDB 使用 BSON (Binary JSON) 格式来存储数据。BSON 是 JSON 的二进制表示形式,它不仅支持 JSON 的所有数据类型,还扩展了许多 JSON 没有的数据类型(如日期、二进制数据等)。
以下是 MongoDB 支持的主要数据类型,按常用程度分类:
1. 核心常用类型
- String (字符串): UTF-8 编码的字符串。这是最常用的数据类型。
- 示例:
"Hello World"
- 示例:
- ObjectId (对象 ID): MongoDB 中文档的默认主键 (
_id) 类型。它是一个 12 字节的十六进制值,具有唯一性,包含时间戳、机器标识、进程 ID 和计数器。- 示例:
ObjectId("507f1f77bcf86cd799439011")
- 示例:
- Boolean (布尔值): 存储
true或false。 - Array (数组): 值的列表或集合。数组中可以包含不同类型的数据(字符串、数字、甚至嵌套文档)。
- 示例:
["apple", "banana", 123]
- 示例:
- Object / Embedded Document (嵌入式文档): 一个文档内部可以包含另一个 BSON 文档。
- 示例:
{"address": {"city": "Beijing", "zip": 100000}}
- 示例:
- Null: 用于表示空值或不存在的字段。
2. 数值类型
在 MongoDB 中,数值不仅仅是“数字”,还细分为以下几种以满足精度需求:
- Double (双精度浮点数): 默认的数值类型。如果你在 Mongo Shell 中直接输入一个数字,它通常被视为 Double。
- Integer (32-bit) (32位整数): 用于存储较小的整数。
- Shell 中使用:
NumberInt(10)
- Shell 中使用:
- Integer (64-bit) (64位整数): 用于存储较大的整数。
- Shell 中使用:
NumberLong(10000000)
- Shell 中使用:
- Decimal128: 128 位基于十进制的浮点数。非常重要,用于金融、货币计算等需要高精度的场景,避免浮点数计算误差。
- Shell 中使用:
NumberDecimal("9.99")
- Shell 中使用:
3. 日期与时间
- Date (日期): 存储当前日期或时间。它是一个 64 位整数,表示自 Unix 纪元(1970年1月1日)以来的毫秒数。
- 注意: MongoDB 存储的时间统一为 UTC 时间。
- 示例:
ISODate("2023-10-01T00:00:00Z")
- Timestamp (时间戳): 注意与 Date 区分。这主要是 MongoDB 内部使用的数据类型(例如用于 Oplog 操作日志和数据同步),包含 64 位值(前 32 位是时间戳,后 32 位是操作序数)。一般业务开发中很少直接使用此类型,而是使用
Date。
4. 特殊类型
- Binary Data (二进制数据): 用于存储字节数组。通常用于存储图片、文件等(虽然大文件建议使用 GridFS)。
- Regular Expression (正则表达式): 直接存储正则表达式,用于模式匹配查询。
- 示例:
/^abc/i
- 示例:
- JavaScript: 存储 JavaScript 代码(可以带作用域或不带作用域)。
- MinKey / MaxKey: 特殊类型,用于比较操作。MinKey 比较时小于所有其他类型,MaxKey 大于所有其他类型。
5. 已废弃或不推荐使用的类型
- Undefined: 已废弃。
- Symbol: 已废弃,通常转换为字符串处理。
- DBPointer: 已废弃。
总结表
| 数据类型 | 说明 |
|---|---|
| String | UTF-8 字符串 |
| Integer | 32位或64位整数 |
| Double | 浮点数 (默认) |
| Decimal128 | 高精度小数 (金融用) |
| Boolean | true / false |
| Null | 空值 |
| Array | 数组/列表 |
| Object | 嵌入式文档 |
| ObjectId | 唯一的 12 字节 ID |
| Date | 日期时间 (UTC) |
| Timestamp | 内部时间戳 (通常用于复制集) |
| Binary Data | 二进制数据 |
| Regular Expression | 正则表达式 |