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
相关产品推荐
相关产品推荐

