文档模型与 BSON
约 539 字大约 2 分钟
布欧-Lewyon
2026-05-15
首页 › MongoDB › 简介 › 文档模型与 BSON
BSON 文档
MongoDB 使用 BSON(Binary JSON)格式存储文档。BSON 是 JSON 的二进制序列化版本,支持更多数据类型。
// JSON
{
"name": "Alice",
"age": 25,
"address": { "city": "Beijing", "zip": "100000" }
}
// BSON(二进制存储,支持更多类型)
{
"_id": ObjectId("665a1b2c3d4e5f6a7b8c9d0e"),
"name": "Alice",
"age": 25,
"salary": NumberDecimal("15000.00"),
"tags": ["developer", "backend"],
"createdAt": ISODate("2026-01-01T00:00:00Z"),
"metadata": { "source": "web" }
}BSON 数据类型
| 类型 | 别名 | 示例 |
|---|---|---|
Double | 浮点数 | 3.14 |
String | 字符串 | "hello" |
Object | 内嵌文档 | { city: "Beijing" } |
Array | 数组 | [1, 2, 3] |
ObjectId | 唯一标识 | ObjectId("665a1b2c...") |
Boolean | 布尔 | true / false |
Date | 日期 | ISODate("2026-01-01") |
Null | 空值 | null |
Int32 | 32 位整数 | NumberInt(42) |
Int64 | 64 位整数 | NumberLong(100000000000) |
Decimal128 | 高精度小数 | NumberDecimal("19.99") |
Timestamp | 时间戳 | Timestamp(1736784000, 1) |
Binary Data | 二进制 | BinData(0, "..." ) |
ObjectId
_id 是每个文档必有的唯一标识,默认自动生成 ObjectId:
// ObjectId 结构(12 字节):
// 4 字节时间戳 + 5 字节随机值 + 3 字节计数器(自增)
ObjectId("665a1b2c3d4e5f6a7b8c9d0e")
// ^^^^^^^^ ^^^^^^^^^^^ ^^^^^^^^
// 时间戳 机器/进程 计数器// 获取 ObjectId 的时间信息
ObjectId("665a1b2c3d4e5f6a7b8c9d0e").getTimestamp()
// ISODate("2026-01-01T00:00:00Z")_id 的生成方式
// 自动生成 ObjectId(默认)
db.users.insertOne({ name: "Alice" })
// { "_id": ObjectId("..."), "name": "Alice" }
// 手动指定 _id(字符串、数字、UUID 均可)
db.users.insertOne({ _id: "user_001", name: "Bob" })
// 使用 UUID
db.users.insertOne({ _id: UUID("..."), name: "Charlie" })文档大小限制
MongoDB 单个文档有 16MB 的大小限制。适用场景差异:
// ✅ 适合内嵌:用户地址(几个字段)
{ name: "Alice", addresses: [
{ city: "Beijing", type: "home" },
{ city: "Shanghai", type: "work" }
]}
// ❌ 不适合内嵌:博客文章的所有评论(可能无限增长)
// 应该使用单独的 comments 集合 + 引用小结
- MongoDB 用 BSON 存储文档,支持比 JSON 更丰富的数据类型。
_id是文档唯一标识,默认 ObjectId(12 字节,含时间戳)。- 文档最大 16MB,大型数组或大量子文档应考虑拆分集合。
- ObjectId 可用于获取文档创建时间(
getTimestamp())。 - 手动设置
_id可用字符串/UUID/数字,灵活性高。
上一节:MongoDB 概述 下一节:安装 MongoDB 与 mongosh
