全书目录

第十九篇:MongoDB 完全指南 —— 弹性档案仓宇宙

第五章:嵌套文档 —— 把子档案装进母档案袋

1 分钟 235 字 第 356 / 962 个阅读单元

MongoDB 的强项之一,就是把相关信息直接放进同一份文档。

例如用户资料:

javascript
db.users.insertOne({
  name: "陈一",
  email: "chenyi@example.com",
  address: {
    city: "上海",
    district: "浦东新区",
    zipCode: "200120"
  },
  preferences: {
    theme: "dark",
    language: "zh-CN"
  }
})

这里的 addresspreferences 都是嵌套文档

还可以嵌套数组:

javascript
db.orders.insertOne({
  orderNo: "ORD-20260328-001",
  customerName: "陈一",
  items: [
    { sku: "BOOK-001", name: "数据库设计", qty: 2, price: 88 },
    { sku: "PEN-002", name: "签字笔", qty: 3, price: 6 }
  ],
  shipping: {
    city: "上海",
    contact: "陈一"
  }
})

这就像一份订单档案袋里,直接附带:

  • 收货信息子档案
  • 商品清单子档案

查询嵌套字段时,用点号路径:

javascript
db.users.find({ "address.city": "上海" })
db.orders.find({ "items.sku": "BOOK-001" })

更新嵌套字段也一样:

javascript
db.users.updateOne(
  { name: "陈一" },
  { $set: { "preferences.language": "en-US" } }
)

什么时候适合嵌套?

  • 子信息天然依附父对象
  • 经常一起读取
  • 一起更新
  • 数量不会无限膨胀

如果你把一个会无限增长的巨大列表硬塞进单文档,档案袋会越来越臃肿。
这就是后面会讲到的模式设计边界。