Postgresql:搜索jsonb对象数组时如何使用动态值?

Posted

技术标签:

【中文标题】Postgresql:搜索jsonb对象数组时如何使用动态值?【英文标题】:Postgresql: How do I use dynamic values when searching jsonb array of objects? 【发布时间】:2021-09-14 14:44:08 【问题描述】:

我目前正在尝试构建一个查询以在 jsonb 数组中查找特定对象。如果我为“游戏”值使用硬编码字符串,我有以下查询,例如

  const findGameQuery = `
        select playing
        from users
        where username = $1
        and playing @> '["game": "new-pokemon-snap"]'
    `

但是,如果我像当前对用户名一样使用动态值,则会收到无效的 json 语法错误。例如

const findGameQuery = `
        select playing
        from users
        where username = $1
        and playing @> '["game": $2]'
    `

    const  rows  = await query(findGameQuery, [username, game]);
    ctx.body = rows

如何在此处使用动态值进行搜索?我进行了大量搜索,但找不到任何示例。 $2 值只是一个字符串,所以不确定为什么不被接受。

【问题讨论】:

【参考方案1】:

当你发送这个查询时,它只有一个参数:

select playing
from users
where username = $1
and playing @> '["game": $2]'

正确的查询是:

select playing
from users
where username = $1
and playing @> $2

你必须用参数中的对象来制作数组。

const gameObj = [
    "game": game
];
const gameParam = JSON.stringify(gameObj);
const  rows  = await query(findGameQuery, [username, gameParam]);

【讨论】:

啊,感谢您的解释和干净的代码。您是否知道是否可以只选择匹配的条目而不是整个表?【参考方案2】:

您不能在字符串文字中使用参数。

使用 PostgreSQL 函数构造 jsonb 对象:

const findGameQuery = `
      select playing
      from users
      where username = $1
      and playing @> jsonb_build_array(jsonb_build_object('game', $2))
  `

【讨论】:

以上是关于Postgresql:搜索jsonb对象数组时如何使用动态值?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL jsonb-通过数组元素搜索字符串

如何从 PostgreSQL 中的 JSONB 数组中获取特定对象的值?

如何将 JSON 对象推送到 postgresql 中 jsonb 列中的数组

在 postgresql、选项数组或对象中插入 jsonb 数据,有效方式

在 PostgreSQL 中的 jsonb 列中搜索 json 数组,其中数据为 json 数组

PostgreSQL 查询 JSONB 字段中的对象数组