不是所有关系都应该塞进同一个档案袋。
例如“用户”和“订单”:
- 用户自己是一份长期存在的主档案
- 订单也是独立存在的业务档案
- 一个用户可以有很多订单
这时就很适合引用:
db.users.insertOne({
_id: ObjectId("660000000000000000000001"),
name: "苏北"
})
db.orders.insertOne({
orderNo: "ORD-9001",
userId: ObjectId("660000000000000000000001"),
totalAmount: 299
})这像什么?
用户档案袋
└── 编号:U-001
订单档案袋
└── 持有人编号:U-001也就是说,订单档案袋不把整份用户档案复印进去,而是只记住用户编号。
嵌套 vs 引用,可以先按这个判断:
适合嵌套
- 资料总是一起读
- 子对象离不开父对象
- 更新常常同步发生
- 数据体量可控
适合引用
- 子对象会独立存在
- 一对多数量可能很大
- 多对多关系明显
- 数据经常独立查询
- 不想重复复制易变字段
如果需要把关联对象拼回来,可以用聚合里的 $lookup,后面会讲。