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

Knex查询数据库JSON数组字段条件失效问题求助

解决JSON数组字段的Knex条件查询问题

问题分析

你的composition字段是JSON数组类型,而非单个JSON对象。直接使用composition->'$.nb_musicians'只会尝试访问数组本身的nb_musicians属性(该属性不存在),而非数组内元素的对应属性,因此查询无法命中目标数据。

针对PostgreSQL的解决方案

如果你的数据库是PostgreSQL(支持jsonb/json类型),可以通过展开JSON数组并检查元素属性的方式实现查询:

.where(qb => {
  if (nbMusicians) {
    qb.whereRaw(
      `EXISTS (
        SELECT 1 FROM jsonb_array_elements(composition) AS elem
        WHERE (elem->'nb_musicians')::integer = ?
      )`,
      [nbMusicians]
    );
  }
})

代码说明

  • jsonb_array_elements(composition):将JSON数组展开为多行记录,每行对应数组中的一个对象,命名为elem。
  • (elem->'nb_musicians')::integer:提取elem中的nb_musicians字段并转为整数,与传入参数做数值比较(避免字符串类型不匹配问题)。
  • EXISTS子查询:只要数组中存在至少一个满足条件的元素,就返回匹配的行。

若你的composition字段是json类型而非jsonb,只需将jsonb_array_elements替换为json_array_elements即可。

针对MySQL的解决方案

如果使用MySQL,可以利用JSON_CONTAINS函数直接检查数组中是否包含符合条件的对象:

.where(qb => {
  if (nbMusicians) {
    qb.whereRaw(
      `JSON_CONTAINS(composition, JSON_OBJECT('nb_musicians', ?))`,
      [nbMusicians]
    );
  }
})

代码说明

JSON_CONTAINS(composition, JSON_OBJECT('nb_musicians', ?)):检查composition数组中是否存在包含nb_musicians等于指定值的对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 20:10:43