簡體   English   中英

使用書架在Postgres JSONB數組元素上執行查詢

[英]Using Bookshelf to execute a query on Postgres JSONB array elements

我有一個帶有jsonb數組元素的postgres表,我正在嘗試執行sql查詢以提取匹配的元素。 我有從postgres命令行界面運行的原始SQL查詢:

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

這將返回我正在尋找的結果(movies表中的所有記錄,導演jsonb元素包含input元素中的任何元素)。

在代碼中,['70,'45']的值將是一個動態變量,即。 fixArr和數組的長度未知。

我正在嘗試將其構建到我的書架代碼中,但未能找到解決用例復雜性的任何示例。 我已經嘗試了以下方法,但是它們都不起作用:

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

有人能幫忙嗎?

如您knexknexbookshelf並沒有為簡化jsonb查詢提供任何支持。 據我所知,唯一支持jsonb查詢等的基於knex的ORM是Objection.js。

在您的情況下,我想更好的運算符來查找jsonb列是否包含任何給定值將為?| ,因此查詢如下:

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

有關如何處理jsonb查詢和使用knex進行索引的更多信息,請參見https://www.vincit.fi/zh/blog/objection-js-postgresql-power-json-queries/

不,您只是在遇到特定查詢構建器和ORM的限制。

最簡單的方法是使用bookshelf.Model.queryknex.rawwhereRaw等)。 具有AS別名,並且如果要考慮此類事情,可以將Bookshelf模型子類化以添加這些別名屬性。

如果您希望東西看起來很干凈並且可以通過書架進行抽象,則只需將JSONB規范化為平面表即可。 如果您的JSONB大多扁平而簡單,這可能是最好的方法。

如果你最終使用大量JSONB的(它可以與合適的索引相當高性能的),那么書架ORM是無用功。 knex查詢構建器僅在處理轉義,引用等方面不浪費時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM