2017-09-16 138 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/