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

MongoDB查询需求:实现多层数据聚合转换与多维度排序

MongoDB嵌套分组与排序解决方案

这是一个典型的多层嵌套分组+多维度排序需求,我帮你编写了对应的聚合查询,完全匹配你想要的输出结构和排序规则:

db.collection.aggregate([
  // 全局预排序:为后续分组的顺序打下基础
  {
    $sort: {
      cat: 1,          // cat按字母升序排列
      subcat: 1,       // subcat按数字升序排列
      age: 1           // Details列表按age升序排列
    }
  },
  // 第一级分组:按subcat维度聚合用户详情
  {
    $group: {
      _id: {
        cat: "$cat",
        catDesc: "$catDesc",
        subcat: "$subcat",
        subcatDesc: "$subcatDesc"
      },
      Details: {
        $push: {
          name: "$name",
          age: "$age"
        }
      }
    }
  },
  // 第二级分组:按cat维度聚合子分类列表
  {
    $group: {
      _id: {
        cat: "$_id.cat",
        catDesc: "$_id.catDesc"
      },
      subcats: {
        $push: {
          subcat: "$_id.subcat",
          subcatDesc: "$_id.subcatDesc",
          Details: "$Details"
        }
      }
    }
  },
  // 对subcats数组按subcat数字排序(修正$group带来的顺序不确定性)
  {
    $addFields: {
      subcats: {
        $sortArray: {
          input: "$subcats",
          sortBy: { subcat: 1 }
        }
      }
    }
  },
  // 整理输出结构,移除冗余的_id字段并提取顶层属性
  {
    $project: {
      _id: 0,
      cat: "$_id.cat",
      catDesc: "$_id.catDesc",
      subcats: 1
    }
  },
  // 最终对顶层的cat按字母顺序排序
  {
    $sort: {
      cat: 1
    }
  }
])

各阶段功能说明:

  • $sort:先对所有文档做全局排序,既保证了Details里的元素按age升序排列,也为后续分组的顺序提供了基础。
  • 第一级$group:将同一cat+subcat下的用户数据聚合,把name和age封装成对象存入Details数组,因为预排序过,Details的顺序直接符合要求。
  • 第二级$group:将同一cat下的子分类聚合结果存入subcats数组。
  • $addFields + $sortArray:MongoDB的$group操作不保证数组元素的顺序,所以这里用$sortArray对subcats按subcat数字升序排序,确保子分类顺序正确。
  • $project:重新整理输出结构,把_id里的cat和catDesc转为顶层字段,移除冗余的_id。
  • 最后$sort:确保顶层的cat按字母顺序排列,完成最终排序要求。

内容的提问来源于stack exchange,提问作者prince47

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:32:50