首页 / MongoDB 入门教程 / 文档结构:字段、内嵌文档、数组

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 作为外层嵌进去。