Sequelize查询结果中访问count字段返回undefined问题求助
问题解决:Sequelize聚合字段
count无法直接访问返回undefined 核心原因
Sequelize默认返回的是Model实例对象,而非普通JSON对象。你通过聚合函数生成的自定义字段(如count、maxLevel)不会直接作为实例的顶层属性存在,而是存储在实例内部的dataValues对象中。直接打印实例时会自动展示dataValues的内容,所以看起来有count字段,但直接通过.访问会返回undefined。
解决方案
方案1:返回纯JSON对象(推荐)
在findAll的配置中添加raw: true选项,查询结果会直接返回普通JavaScript对象,就能正常访问count字段:
const users = await models["account"].findAll({ raw: true, // 新增该选项 subQuery: false, where: params.search && { [Op.or]: [ { first_name: { [Op.like]: `%${params.search}%` } }, { last_name: { [Op.like]: `%${params.search}%` } }, { email: { [Op.like]: `%${params.search}%` } }, ], }, include: [ { model: models["kyc_verification"], as: "kyc_verifications", include: [ { model: models["kyc_verification_level"], as: "kyc_verification_level", }, ], attributes: [ [models.sequelize.fn("COUNT", "*"), "count"], [ models.sequelize.fn( "MAX", models.sequelize.col( "kyc_verifications.kyc_verification_level.index" ) ), "maxLevel", ], ], }, ], group: ["account.id"], having: params.level && { "kyc_verifications.maxLevel": params.level, }, order: [["created_at", "DESC"]], limit: 100, offset, }); return users[0].kyc_verifications[0].count; // 现在可正常访问
方案2:通过实例get()方法访问字段
如果需要保留Model实例(比如后续要调用实例方法),可以使用Sequelize实例提供的get()方法获取聚合字段:
return users[0].kyc_verifications[0].get('count');
额外注意点
你的查询group仅指定了account.id,但包含了kyc_verification_level的关联数据,这在部分数据库(如PostgreSQL)中可能触发SQL语法错误(非聚合字段需包含在GROUP BY中)。若后续出现查询报错,需调整group配置,添加关联表的必要主键字段,示例:
group: ["account.id", "kyc_verifications.id", "kyc_verifications->kyc_verification_level.id"]
内容的提问来源于stack exchange,提问作者Preshy Jones
相关产品推荐
相关产品推荐

