$lookup(跨集合关联)
最后更新:2026-10-09
$lookup(跨集合关联)
$lookup 在当前集合中执行与另一个集合的等值关联(left outer join),把匹配的文档作为数组附加到每条结果文档。它等价于 SQL 的 LEFT JOIN,让聚合管道可以跨集合组合数据,避免手动多次查询。注意:$lookup 只能做等值匹配,不能做范围或条件 join。
| 分类 | 核心阶段 |
|---|---|
| MongoDB 版本 | 3.2+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $lookup: { from: <集合>, localField: <本地字段>, foreignField: <外部字段>, as: <输出数组> } }
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $lookup:订单关联客户名
db.orders.aggregate([
{ $lookup: {
from: "customers",
localField: "cust_id",
foreignField: "_id",
as: "customer"
} }
])
运行结果:
{ "_id": 1, "cust_id": "A123", "customer": [{ "_id": "A123", "name": "Alice" }] }
📌 注意事项
- from 指定的集合在同一数据库内,不能跨库
- 匹配字段名必须精确,localField 与 foreignField 类型需一致
- 无匹配时 as 数组为空 [],不是 null
- 3.6+ 支持内嵌管道(pipeline 字段)做更复杂关联;5.0+ 新增简洁语法,关联子查询无需再写 $expr
🏷️ 相关标签
💡 相关案例
聚合管道进阶:复杂表达式与转换
聚合管道入门:aggregate方法与基础阶段
实战:博客评论系统CRUD
数据库与集合:MongoDB的命名空间管理
文档与BSON:MongoDB的数据基石
$facet + $bucket + 文本/地理空间搜索
$lookup与多集合关联
mongoose高级模式:性能与灵活性
mongoose模型与Schema设计
mongoose数据校验与中间件
📚 相关教程
❓ 常见问题
Q$lookup 能替代数据库端的 JOIN 吗?
A能实现类似效果,但 MongoDB 的 $lookup 在查询时合并数据:等值匹配与管道内的简单比较可用索引,复杂条件 join 的优化能力不如 SQL 数据库全面,数据量极大时需评估性能。
Q$lookup 的性能如何优化?
A在关联集合的外键字段上建索引是关键。此外优先在管道前用 $match 缩小主集合,避免大集合全表关联。
Q$lookup 支持多条件关联吗?
A支持。3.6 起可用管道形式 $lookup 配合 $expr 实现多字段关联、子查询等复杂逻辑,而不局限于单外键相等。