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

在Node.js应用中使用Knex.js实现PostgreSQL JSON列的文本搜索

在Knex.js中查询PostgreSQL JSON列包含指定值

嘿,我来帮你搞定这个问题!其实在Knex.js里实现你要的JSON列模糊搜索很简单,有两种常用方式,还可以给你推荐更精准的JSON查询方法:

方法一:直接用whereRaw复用你的原生SQL逻辑

这是最直接的方式,完全贴合你原来的原生SQL写法,而且Knex的占位符还能帮你避免SQL注入:

const searchValue = 'your_target_value';
const results = await knex('<table_name>')
  .whereRaw('??::text like ?', ['<json_column_name>', `%${searchValue}%`]);

这里的??是Knex用来安全替换列名的占位符,?用来替换搜索值,比直接拼接字符串安全多了。

方法二:用Knex链式调用风格实现

如果你更喜欢用Knex的链式语法,可以把JSON列转文本的操作放在knex.raw里,再结合like条件:

const searchValue = 'your_target_value';
const results = await knex('<table_name>')
  .where(knex.raw('??::text', ['<json_column_name>']), 'like', `%${searchValue}%`);

这个写法和方法一的效果完全一致,只是风格不同而已。

额外推荐:更精准的JSON查询(效率更高)

如果你的JSON结构是固定的,其实没必要用模糊匹配整个文本,PostgreSQL有专门的JSON操作符可以做精准查询,效率更高还不会误匹配:

  • 比如你的JSON列是数组结构(例:{"tags": ["foo", "bar"]}),要检查数组里是否包含某个值:
const results = await knex('<table_name>')
  .whereRaw('?? @> ?', ['<json_column_name>', JSON.stringify({ tags: ['foo'] })]);
  • 如果是简单键值对,要匹配某个键的具体值:
const results = await knex('<table_name>')
  .whereRaw('??->>? = ?', ['<json_column_name>', 'key_name', 'target_value']);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 19:22:35