MongoDB 入门教程
文档结构:字段、内嵌文档、数组
本教程共 50 篇 · 第 8 篇 · 更新于 2026-07-30 · 约 7 分钟阅读
MongoDBMongoDB 入门教程文档结构内嵌文档数组点号路径
8. 文档结构:字段、内嵌文档、数组
本节目标:弄懂一个文档内部怎么组织——字段、内嵌文档、数组各怎么写,点号怎么用来访问深层字段。
8.1 字段与值
文档由若干「字段名: 值」组成。字段名是字符串,值可以是任意 BSON 类型。
// 一条用户文档,字段值类型各不相同
{
_id: 1,
name: "张伟", // 字符串
age: 28, // 数字
active: true, // 布尔
city: "北京" // 字符串
}
字段名在同一个文档里不能重复,否则后写的会覆盖先写的。
8.2 内嵌文档
一个字段的值可以又是一个文档,这就叫内嵌文档(Embedded Document)。
// address 是一个内嵌文档
{
_id: 1,
name: "张伟",
address: {
city: "北京",
district: "海淀",
street: "中关村大街"
}
}
8.3 点号路径访问
要访问内嵌文档里的字段,用「点号(dot notation)」:外层字段.内层字段。
// 查 address.city 等于 "北京" 的文档
db.users.find({ "address.city": "北京" })
点号同样能用在更新里:
// 只改内嵌文档里的 district
db.users.updateOne(
{ _id: 1 },
{ $set: { "address.district": "朝阳" } }
)
Tip点号路径在查询和更新里都通用。记住一点:字段名本身不能含
.,否则和点号路径冲突,MongoDB 会分不清。
8.4 数组字段
数组(Array)让一个字段能装多个值,值之间类型还能不一样。
// tags 是字符串数组,items 是文档数组
{
_id: 1001,
tags: ["vip", "gamer"],
items: [
{ product: "键盘", qty: 1, price: 199 },
{ product: "鼠标", qty: 2, price: 89 }
]
}
数组里再嵌文档,是电商、标签系统最常用的形态。后面「数组查询」章节专门讲怎么查它。
8.5 嵌套深度限制
文档可以一层套一层,但有限度。MongoDB 规定 BSON 文档的最大嵌套深度是 100 层。
// 正常嵌套没问题,但别真写 100 层,那是反模式
{ a: { b: { c: { d: 1 } } } }
Note据 MongoDB 8.3 官方文档,包含内嵌文档在内的 BSON 文档最大深度为 100 层。实际业务里超过三五层就该重新审视结构了。
8.6 字段名的限制
写字段名时有几条红线:
- 不能包含空字符
\0,那是字段名的结尾符。 - 不能包含
.(点号),会和路径访问冲突。 - 顶层字段名不能以
$开头(系统保留)。 _id是主键字段,建议每条文档都有。
Warning我见过有人用
user.name当字段名,结果查询怎么都写不对。字段名叫name就好,把user作为外层嵌进去。