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

如何在NestJS中使用TypeORM Repository实现GroupBy?

在TypeORM Repository模式中实现GroupBy查询

方法1:通过find/findAndCount配置项直接实现

TypeORM的Repository核心方法(如find、findAndCount)的选项参数支持groupBy字段,搭配select指定查询字段(含聚合函数)即可实现分组,示例如下:

假设你有Order实体,需按userId分组统计每个用户的订单数量:

import { getRepository } from "typeorm";
import { Order } from "./entities/Order";

const orderRepo = getRepository(Order);

// 分组查询示例
const userOrderStats = await orderRepo.find({
  select: [
    "userId",
    "id", // 注意:非聚合字段必须加入groupBy数组
    () => "COUNT(id) as orderCount" // 聚合函数+别名,用于后续读取结果
  ],
  groupBy: ["userId", "id"],
});

// 获取统计结果
console.log(userOrderStats[0].orderCount);

方法2:通过Repository创建QueryBuilder(适配复杂场景)

如果需要结合条件筛选、多表关联等复杂逻辑,可直接调用Repository的createQueryBuilder方法——这依然属于Repository模式范畴,只是借助QueryBuilder的语法实现分组:

const userOrderStats = await orderRepo
  .createQueryBuilder("order")
  .select("order.userId", "userId")
  .addSelect("COUNT(order.id)", "orderCount")
  .groupBy("order.userId")
  .where("order.status = :status", { status: "completed" }) // 可选:添加筛选条件
  .getRawMany(); // 用getRawMany获取带别名的聚合结果

注意事项

  • 使用find方法的groupBy时,所有非聚合字段必须包含在groupBy数组中,否则会触发数据库语法错误。
  • 聚合函数的结果需通过别名获取,可直接访问属性(find方式)或用getRawMany(QueryBuilder方式)。
  • 低版本TypeORM可能对find选项中的groupBy支持不完善,此时优先使用createQueryBuilder方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:55:20