MongoDB使用$graphLookup实现论坛多级嵌套评论树形结构查询
实现嵌套树形评论结构的方案
你要实现的带层级嵌套的评论树,直接使用$graphLookup只能得到平级的后代评论列表,无法自动生成嵌套的reply结构,可通过以下两种方案实现:
方案1:MongoDB 聚合查询实现(要求版本≥4.4)
直接通过聚合管道一步得到目标结构,完整聚合语句如下:
db.comment.aggregate([ // 1. 匹配根评论(parent为null,可补充assetId条件筛选指定内容的评论) { $match: { parent: null, assetId: "611a50be0b8d8ea3dbe0f180" } }, // 2. 递归查询所有后代评论 { $graphLookup: { from: "comment", startWith: "$_id", connectFromField: "_id", connectToField: "parent", as: "all_replies", maxDepth: 100 // 可自定义最大评论层级 } }, // 3. 递归构造嵌套reply结构 { $addFields: { reply: { $function: { body: function(rootId, allReplies) { const buildTree = (parentId) => { const children = allReplies.filter(item => item.parent === parentId); return children.map(child => { child.reply = buildTree(child._id); return child; }) } return buildTree(rootId); }, args: ["$_id", "$all_replies"], lang: "js" } } } }, // 4. 移除临时字段 { $unset: "all_replies" } ])
方案2:后端代码组装(兼容性更强、易维护)
如果评论量级不大,更推荐先全量查询指定assetId下的所有评论,再通过后端代码递归构造树形结构,示例JS代码如下:
// 先查询指定assetId下的所有评论 const allComments = await db.comment.find({assetId: "611a50be0b8d8ea3dbe0f180"}).toArray(); // 构造树形结构 function buildTree(parentId, comments) { const tree = []; for (const comment of comments) { if (comment.parent === parentId) { const children = buildTree(comment._id, comments); if (children.length > 0) { comment.reply = children; } tree.push(comment); } } return tree; } // 得到最终嵌套结构 const result = buildTree(null, allComments);
内容的提问来源于stack exchange,提问作者sruthi23
相关产品推荐
相关产品推荐

