You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:45:04