Skip to content

MongoDB 关系

关系类型

MongoDB 是文档型数据库,没有外键约束,但可以通过嵌入引用表达实体间关系。

1. 一对一 / 一对多:嵌入

将子文档直接嵌在父文档中,适合“子”总随“父”一起读写、数量有限的场景:

javascript
{
  _id: 1,
  name: "张三",
  address: {
    city: "北京",
    street: "朝阳路 100 号"
  }
}

一对多示例(评论列表):

javascript
{
  _id: 1,
  title: "文章标题",
  comments: [
    { author: "李四", text: "评论1" },
    { author: "王五", text: "评论2" }
  ]
}

优点:一次查询拿到完整数据。缺点:文档变大、数组无限增长时需控制。

2. 多对一 / 多对多:引用

在文档中只存对方文档的 _id,通过应用层或 $lookup 再查:

javascript
// 订单集合
{ _id: 1, userId: ObjectId("..."), amount: 100 }
// 用户集合
{ _id: ObjectId("..."), name: "张三" }

适合多对多、或“子”独立访问、更新频繁的场景。

3. 使用 $lookup 做“连接”

聚合阶段 $lookup 可根据引用字段从另一集合拉取数据,类似 SQL 的 JOIN:

javascript
db.orders.aggregate([
  { $lookup: {
    from: "users",
    localField: "userId",
    foreignField: "_id",
    as: "userInfo"
  }}
])

选择嵌入还是引用需根据查询模式、更新频率与文档大小权衡。下一节介绍 MongoDB 数据库引用