$graphLookup(图关联)

最后更新:2026-10-09

$graphLookup(图关联)

$graphLookup 在集合上做递归查找,模拟图遍历:从每条文档的 connectFromField 值出发,递归匹配 connectToField,直到 maxDepth 或不再有匹配,结果存入 as 字段。适合组织架构、分类树、路由跳数等场景。与 $lookup 不同,它能跨任意层级递归。

分类高级与诊断
MongoDB 版本1.0+
示例语言mongosh (Shell)

📝 语法

{ $graphLookup: { from: "<集合名>", startWith: <表达式>, connectFromField: "<字段>", connectToField: "<字段>", as: "<输出字段>", maxDepth: <数字>, depthField: "<深度字段>" } }

⚙️ 参数

from要递归查找的目标集合。
startWith递归起点的值表达式。
connectFromField当前文档中携带匹配值的字段。
connectToField目标集合中被匹配的字段。
as递归结果写入的字段名。
maxDepth最大递归层数,省略表示无限制。

返回值:每条文档附加递归结果数组

▶ 示例

请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):

// $graphLookup:找每个员工的上级链
db.employees.aggregate([
  { $graphLookup: {
    from: 'employees',
    startWith: '$reportsTo',
    connectFromField: 'reportsTo',
    connectToField: 'name',
    as: 'chain'
  } }
])

运行结果:

// 每条员工文档带 chain 递归上级数组

📌 注意事项

更多实战案例即将上线,敬请期待。

📚 相关教程

❓ 常见问题

Q$graphLookup 和 $lookup 有什么区别?
A$lookup 只做一层关联;$graphLookup 递归遍历多层级关系。
Q递归会无限循环吗?
A会持续到没有匹配为止,可用 maxDepth 限制层数。
Q结果包含自己吗?
A不包含,startWith 是查找起点,结果是与之匹配的其他文档。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏