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

Sequelize多对多关联查询:如何筛选关联Bar数量大于2的Foo记录

实现方式

你可以通过GROUP BY + HAVING的组合来筛选关联数量符合要求的记录,以下是两种常用写法:

写法1:筛选同时返回关联的bars数据

如果你需要保留每个Foo对应的bars数组内容,可以用如下写法:

// 先从sequelize引入需要的工具方法,也可以直接从你初始化的sequelize实例上取
const { Op, fn, col, where } = require('sequelize');

const foos = await Foo.findAll({
  include: [{
    model: Bar,
    as: 'bars',
    // 若不需要返回bar的具体字段,可以打开下面的注释提升查询性能
    // attributes: []
  }],
  // 按Foo的主键分组,PostgreSQL需要额外把返回的所有Bar字段也加入group数组
  group: ['Foo.id'],
  // 筛选关联bar数量大于2的记录
  having: where(fn('COUNT', col('bars.id')), '>', 2)
});

写法2:仅筛选符合条件的Foo,不返回关联bars

如果你不需要返回关联的Bar数据,用子查询的方式性能更高,避免了大表JOIN的开销:

const { Op } = require('sequelize');

const foos = await Foo.findAll({
  where: {
    id: {
      [Op.in]: sequelize.literal(`(SELECT foo_id FROM FooBar GROUP BY foo_id HAVING COUNT(bar_id) > 2)`)
    }
  }
});

注意事项

你当前的Bar模型关联配置里as属性写的是bars,属于笔误,建议改成foos,避免后续查询Bar关联Foo的时候出现别名冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:09:02