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

Node.js使用pg库查询PostgreSQL JSONB列如何去掉外层列名嵌套

解决方法

有两种常用实现方案,你可以根据自身需求选择:

方案1:SQL层直接返回目标格式

不需要在Node.js侧做额外处理,修改查询语句即可,利用PostgreSQL内置的JSON聚合函数直接拼接出你要的数组结构:

-- 无匹配数据时返回空数组可改为:COALESCE(json_agg(data), '[]'::json) AS result
SELECT json_agg(data) AS result
FROM appanalytics
WHERE to_date(data->>'dateTime', 'MM/DD/YYYY') BETWEEN $3 AND $4
  AND cid = $1 AND aid = $2

调用时直接取聚合结果即可:

anpool.query(
  `SELECT json_agg(data) AS result
    FROM appanalytics
    WHERE to_date(data->>'dateTime', 'MM/DD/YYYY') BETWEEN $3 AND $4
    AND cid=$1 AND aid=$2`,
  [req.session.cID, req.session.AccountID, endDate, startDate]
).then(res => {
  const analytics = res.rows[0].result
  console.log(analytics) // 直接输出无嵌套的对象数组
})

方案2:Node.js侧做轻量转换

不需要修改现有SQL逻辑,拿到查询结果后做一次数组映射,提取每个行的test字段即可,代码改动最小:

anpool.query(
  /* 你原来的SQL语句不变 */,
  [req.session.cID, req.session.AccountID, endDate, startDate]
).then(res => {
  // 提取每行的test字段组成新数组
  const analytics = res.rows.map(item => item.test)
  console.log(analytics)
})

注意:pg包返回的查询结果对象中,行数据默认存在rows属性下,你原来的代码直接打印analytics拿到的是完整的查询响应对象,需要先取rows属性再做处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 11:18:03