测试jsonb数组是否包含一个或多个元素?

时间:2019-05-28 22:08:59

标签: javascript postgresql knex.js

我有一个带有user jsonb列的data表。这样,我有一个cars数组,其中可以包含0-N辆汽车。

我正在尝试执行类似的查询,以查找用户的cars数组是否包含Toyota或Mitsubishi,但会引发错误

await knex('users.record')
    .where('created_at', '>', '2019-05-21')
    .select('data')
    .whereRaw('cars', ['Toyota', 'Mitsubishi']) // this seems wrong
    .returning('*');

一个示例用户的cars数组是['Toyota', 'Mitsubishi', 'Honda', 'Ford']

3 个答案:

答案 0 :(得分:0)

尝试更换

.whereRaw('cars', ['Toyota', 'Mitsubishi'] 

使用

where('cars', 'like','%Toyota%').orWhere('cars', ,like, '%Mitsubishi%')

答案 1 :(得分:0)

您可以使用jsonb contains operator @>

SELECT * FROM users
WHERE  created_at > '2019-05-21'
AND   (data @> '{"cars":["Toyota"]}' OR
       data @> '{"cars":["Mitsubishi"]}');

纯SQL,我对knex不熟悉。
可以通过索引来支持。参见:

答案 2 :(得分:0)

我认为在Knex中会看起来像这样(带有一些辅助功能以减少重复):

const hasCar = brand => knex.raw(
  `?? @> ?::jsonb`,
  [
    'data',
    JSON.stringify({ cars: [ brand ]})
  ]
)

knex('users.record')
  .where(hasCar('Mitsubishi'))
  .orWhere(hasCar('Toyota'))