2017-09-16 119 views
2

我有一个postgres表与jsonb数组元素,我试图做sql查询来提取匹配的元素。我有一个从Postgres的命令行界面运行原始的SQL查询:使用书架在Postgres JSONB数组元素上执行查询

select * from movies where director @> any (array ['70', '45']::jsonb[]) 

这将返回我要找的(从电影表中的所有记录的结果,其中导演jsonb元素包含在输入任何元素元件)。

在代码中,['70,'45']的值将是一个动态变量,即。 fixArr和数组的长度未知。

我试图将其构建到我的Bookshelf代码中,但一直未能找到解决用例复杂性的任何示例。我试过以下方法,但他们都不工作:

models.Movies.where('director', '@> any', '(array' + JSON.stringify(fixArr) + '::jsonb[])').fetchAll() 
ERROR: The operator "@> any" is not permitted 

db.knex.raw('select * from movies where director @> any(array'+[JSON.stringify(fixArr)]+'::jsonb[])') 
ERROR: column "45" does not exist 

models.Movies.query('where', 'director', '@>', 'any (array', JSON.stringify(fixArr) + '::jsonb[])').fetchAll() 
ERROR: invalid input syntax for type json 

任何人都可以帮忙吗?

回答

0

正如您已经注意到的,knexbookshelf不会为简化Jsonb查询提供任何支持。据我所知,支持jsonb查询等好听点是Objection.js

在你的情况,我想更好的运营商发现,如果jsonb列包含任何给定的值将是?|唯一knex基于ORM,所以查询会像:

const idsAsString = ids.map(val => `'${val}'`).join(','); 
db.knex.raw(`select * from movies where director \\?| array[${idsAsString}]`); 

更多信息如何处理jsonb查询和索引与knex可以在这里找到https://www.vincit.fi/en/blog/objection-js-postgresql-power-json-queries/