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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:36:03