如何通过GORM高效按task_id分组返回嵌套列表或结果映射?
GORM分组返回嵌套列表的优化方案
GORM本身无法直接返回按task_id分组的嵌套列表,但可以通过两种更高效的方式实现需求:
1. 数据库层面聚合(适合大数据量)
利用数据库的JSON聚合函数直接完成分组逻辑,从查询阶段就输出结构化的分组结果,减少应用层的内存处理压力。以MySQL为例:
// 定义分组结果结构体 type GroupedResult struct { TaskID uint `gorm:"column:task_id"` Items []*modelExample `gorm:"column:items;serializer:json"` } var groupedResults []GroupedResult // 原生SQL聚合查询,需将modelExample的字段逐一映射到JSON_OBJECT中 DB.Raw(` SELECT task_id, JSON_ARRAYAGG(JSON_OBJECT( 'task_id', task_id, 'field1', field1, 'field2', field2 )) AS items FROM model_examples GROUP BY task_id ORDER BY task_id `).Scan(&groupedResults)
PostgreSQL可替换为json_agg函数,语法逻辑一致。
2. 应用层Map高效分组(代码简洁易维护)
如果不想编写原生SQL,用Map实现O(n)时间复杂度的分组,比普通遍历嵌套分组更高效:
// 先按原逻辑查询所有数据 res := []*modelExample{} DB.Model(&modelExample{}).Order("task_id").Find(&res) // 用Map快速分组 taskGroupMap := make(map[uint][]*modelExample) for _, item := range res { taskGroupMap[item.TaskID] = append(taskGroupMap[item.TaskID], item) } // 转换为嵌套列表格式 var nestedList [][]*modelExample for _, group := range taskGroupMap { nestedList = append(nestedList, group) }
两种方案对比:
- 大数据量场景优先选数据库聚合,减少数据传输和应用层计算量
- 小数据量场景选Map分组,代码更简洁,无需关注数据库方言差异
内容的提问来源于stack exchange,提问作者kohrhea
相关产品推荐
相关产品推荐

