MongoDB匹配指定id后获取12条关联记录的查询方法如何实现?
MongoDB 递归查询12层推荐人链实现方案
问题原因
你当前的写法仅过滤
memberno等于signuprefno的单条记录,limit(12)和排序逻辑无法获取层级关联的推荐人数据,不符合链表式的关联查询需求。
正确实现方案
使用MongoDB聚合管道的$graphLookup算子,专门用于处理这种自递归的关联查询,可以直接按关联规则拉取指定层级的记录:
const refxna = await Member.aggregate([ // 匹配起始用户(输入id对应的用户) { $match: { memberno: signuprefno } }, // 递归查询关联的推荐人链 { $graphLookup: { from: "members", // 替换为Member集合对应的MongoDB实际表名,通常为小写复数形式 startWith: "$refmno", // 从起始用户的推荐人id开始递归匹配 connectFromField: "refmno", // 每次递归取当前文档的refmno作为匹配值 connectToField: "memberno", // 匹配目标文档的memberno字段 maxDepth: 11, // 起始用户算1条,12条总记录对应递归深度为11 as: "refChain", // 关联出的11条推荐人存入该字段 depthField: "depth" // 可选参数,返回层级深度便于后续排序 } }, // 合并起始用户和关联推荐人到同一个数组 { $project: { fullChain: { $concatArrays: [ [{ _id: "$_id", memberno: "$memberno", refmno: "$refmno", depth: 0 }], "$refChain" ] } } }, // 拆分数组为单条文档 { $unwind: "$fullChain" }, // 替换根节点为最终的用户记录 { $replaceRoot: { newRoot: "$fullChain" } }, // 限制返回12条,避免超出层级上限 { $limit: 12 } ])
补充说明
- 如果你需要按插入倒序排列,可在
$unwind阶段之后、$limit阶段之前添加{ $sort: { $natural: -1 } }即可 - 若要调整关联方向(查询该用户的所有被推荐人),仅需交换
connectFromField和connectToField的取值即可
内容的提问来源于stack exchange,提问作者Beren
相关产品推荐
相关产品推荐

