MongoDB聚合查询如何加载含DBRef的嵌套关联文档
解决MongoDB多集合DBRef关联聚合查询问题
聚合查询命令
针对你的集合结构和需求,以下是可行的聚合命令,分两步完成关联:
db.users.aggregate([ // 第一步:关联users_have_plots集合 { $lookup: { from: "users_have_plots", let: { userPlotRefs: "$plots" }, pipeline: [ { $match: { $expr: { $in: [ "$_id", { $map: { input: "$$userPlotRefs", as: "ref", in: "$$ref.$id" } } ] } } }, // 第二步:在users_have_plots的管道内关联plots集合 { $lookup: { from: "plots", let: { plotRef: "$plot" }, pipeline: [ { $match: { $expr: { $eq: [ "$_id", "$$plotRef.$id" ] } } } ], as: "plot_details" } }, // 将plot_details数组转为单个文档(每个users_have_plots对应一个plots) { $unwind: "$plot_details" } ], as: "user_plots" } } ])
关键说明
处理users与users_have_plots的DBRef关联:
- 用
$map遍历users的plots数组(DBRef集合),提取每个DBRef的$id字段生成ObjectId数组,再通过$in匹配users_have_plots的_id。 - 即使users的
plots为空数组,$map也会返回空数组,不会触发"$in requires an array"报错。
- 用
嵌套关联plots集合:
- 在users_have_plots的lookup管道内,直接提取其
plot字段(DBRef)的$id,与plots的_id做相等匹配。 - 用
$unwind把plot_details数组转为单个对象,让结果结构更直观。
- 在users_have_plots的lookup管道内,直接提取其
版本兼容性:
- 该写法使用的
$expr和变量引用特性,完全适配MongoDB 6.0.2版本。
- 该写法使用的
常见问题排查
- 若查询无关联plots:检查users_have_plots的
plot字段是否为有效DBRef($ref需为"plots",$id需是plots集合中存在的ObjectId)。 - 若仍报数组错误:确认users的
plots字段是数组类型,哪怕是空数组也可,避免字段缺失或为单个DBRef而非数组。
内容的提问来源于stack exchange,提问作者SoT
相关产品推荐
相关产品推荐

