Mongoose嵌套层级按category分组 二级分类分组过滤实现求助
Mongoose三级分类嵌套分组实现方案
你可以选择两种实现路径,分别是查询阶段用聚合直接生成目标结构,或对现有返回结果做二次处理:
方案1:Mongoose聚合查询直接分组
聚合逻辑如下:
YourModel.aggregate([ // 第一步:按一级分类+二级分类分组,收集所有三级分类 { $group: { _id: { level1Id: "$_id", level1Title: "$title", level2Id: "$level2._id", level2Title: "$level2.title", level2ParentId: "$level2.parentId" }, level3List: { $push: "$level2.level3" } } }, // 第二步:按一级分类分组,收集所有二级分类(已携带三级列表) { $group: { _id: "$_id.level1Id", title: { $first: "$_id.level1Title" }, parentId: { $first: null }, children: { $push: { _id: "$_id.level2Id", title: "$_id.level2Title", parentId: "$_id.level2ParentId", children: "$level3List" } } } }, // 可选:调整字段顺序符合你的输出习惯 { $project: { _id: 1, title: 1, parentId: 1, children: 1 } } ])
返回的结果结构和你期望的嵌套层级完全匹配,每一级的children就是下一级的分类列表。
方案2:对现有接口返回的data数组做二次处理
如果你不想修改原有查询逻辑,可以直接对已经拿到的平级数据做遍历分组,实现代码如下:
// rawData 就是接口返回的data数组 function groupCategories(rawData) { const level1Map = new Map() rawData.forEach(item => { // 处理一级分类 if (!level1Map.has(item._id)) { level1Map.set(item._id, { _id: item._id, title: item.title, parentId: null, level2: new Map() }) } const level1 = level1Map.get(item._id) const level2 = item.level2 // 处理二级分类 if (!level1.level2.has(level2._id)) { level1.level2.set(level2._id, { _id: level2._id, title: level2.title, parentId: level2.parentId, level3: [] }) } // 加入三级分类 level1.level2.get(level2._id).level3.push(level2.level3) }) // 把Map转成普通数组结构,去掉中间用的Map格式 return Array.from(level1Map.values()).map(l1 => { return { ...l1, level2: Array.from(l1.level2.values()) } }) } // 调用示例 const groupedData = groupCategories(response.data)
处理后得到的groupedData就是你需要的嵌套分类结构。
内容的提问来源于stack exchange,提问作者Riddhish.Chaudhari
相关产品推荐
相关产品推荐

