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

Sequelize关联查询时如何将返回的对象数组转换为纯字符串数组

解决方案

Sequelize 本身没有内置配置可以直接将关联查询的单字段返回为纯数组,关联查询默认会返回关联模型的对象结构,你可以通过以下两种方式实现需求:

方案1:查询后做数据转换(最通用,推荐)

这种方式不依赖数据库类型,兼容所有 Sequelize 版本,逻辑简单易维护:

const dbDataTest = await Recipe.findAll({
    include: [
      {
        model: Diet,
        attributes: ['name'], // 直接指定查询字段比exclude写法更简洁
        through: {attributes: []}
      },
    ],
});

// 转换为目标格式
const formattedResult = dbDataTest.map(recipe => {
  const plainRecipe = recipe.toJSON();
  // 提取diet的name字段组成纯数组
  plainRecipe.diets = plainRecipe.diets.map(diet => diet.name);
  return plainRecipe;
})

方案2:使用数据库聚合函数在查询层处理

如果你希望减少内存转换的逻辑,可以结合对应数据库的聚合函数实现:

MySQL 环境示例:

const { sequelize } = require('./你的sequelize实例文件路径');

const dbDataTest = await Recipe.findAll({
  attributes: [
    'id',
    'name', // 此处列出所有你需要返回的Recipe表字段
    [sequelize.fn('GROUP_CONCAT', sequelize.col('diets.name')), 'diets']
  ],
  include: [
    {
      model: Diet,
      attributes: [], // 关联模型不返回额外字段
      through: {attributes: []}
    }
  ],
  group: ['Recipe.id'], // 按主表ID分组
  raw: true // 直接返回纯JSON对象,不封装Sequelize实例
});

// 把逗号拼接的diet字符串转为数组
const formattedResult = dbDataTest.map(recipe => ({
  ...recipe,
  diets: recipe.diets ? recipe.diets.split(',') : []
}))

PostgreSQL 环境示例:

把上述代码中的GROUP_CONCAT替换为STRING_AGG即可,其余逻辑一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 01:03:00