全书目录

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

第六章:引用 —— 用档案编号把多份档案关联起来

1 分钟 270 字 第 357 / 962 个阅读单元

不是所有关系都应该塞进同一个档案袋。

例如“用户”和“订单”:

  • 用户自己是一份长期存在的主档案
  • 订单也是独立存在的业务档案
  • 一个用户可以有很多订单

这时就很适合引用

javascript
db.users.insertOne({
  _id: ObjectId("660000000000000000000001"),
  name: "苏北"
})

db.orders.insertOne({
  orderNo: "ORD-9001",
  userId: ObjectId("660000000000000000000001"),
  totalAmount: 299
})

这像什么?

text
用户档案袋
└── 编号:U-001

订单档案袋
└── 持有人编号:U-001

也就是说,订单档案袋不把整份用户档案复印进去,而是只记住用户编号。

嵌套 vs 引用,可以先按这个判断:

适合嵌套

  • 资料总是一起读
  • 子对象离不开父对象
  • 更新常常同步发生
  • 数据体量可控

适合引用

  • 子对象会独立存在
  • 一对多数量可能很大
  • 多对多关系明显
  • 数据经常独立查询
  • 不想重复复制易变字段

如果需要把关联对象拼回来,可以用聚合里的 $lookup,后面会讲。