[英]Search jsonb fields in postgresql with Hasura
是否可以使用 hasura 在 jsonb 字段中進行大於搜索?
它看起來在 PostgreSQL 本身中是可能的, 我怎樣才能做到小於、大於 JSON Postgres 字段?
在 postgres 中,我正在存儲一張表
資產
元數據看起來像這樣。
{'長度':5}
我能夠使用_contains
找到完全匹配的asset
。
{
asset(where:{metadata : {_contains : {length: 5}}}){
name
metadata
}
}
我希望能夠找到長度超過 10 的asset
。
我試過了:
{
asset(where:{metadata : {_gt : {length: 10}}}){
name
metadata
}
}
Hasura 文檔:JSONB 運算符(_contains、_has_key 等)僅提及 4 個運算符:
_contains、_contained_in、_has_key、_has_keys_any 和 _has_keys_all 運算符用於基於 JSONB 列進行過濾。
所以直接回答你的問題:不。在hasura的graphql級別上是不可能的。
(至少現在還不可能。誰知道呢:也許在未來的版本中會實現更多的運算符。)
但還有另一種方式, https://hasura.io/blog/postgres-json-and-jsonb-type-support-on-graphql-41f586e47536/#derived-data 中解釋的方法
此建議重復: https : //github.com/hasura/graphql-engine/issues/6331
我們沒有像 JSONB 這樣的運算符(可能會通過 #5211 之類的方法解決),但您可以使用視圖或計算字段將 JSONB 列中的文本字段展平為新列,然后對其進行類似操作。
食譜是:
1. 創建視圖
CREATE VIEW assets -- note plural here. Name view accordingly to your style guide
AS
SELECT
name,
version,
metadata,
(metadata->>'length')::int as meta_len -- cast to other number type if needed
FROM asset
2.注冊這個視圖
3. 像往常一樣在graphql查詢中使用它
例如
query{
assets(where: {meta_len: {_gt:10}}){
name
metadata
}
1.創建SETOF函數
CREATE FUNCTION get_assets(min_length int DEFAULT 0)
RETURNS SETOF asset
LANGUAGE SQL
STABLE
AS $$
SELECT * FROM asset
WHERE
(metadata->>'length')::int > min_length;
$$;
2.在hasura注冊
3. 在查詢中使用
query{
get_assets(args: {min_length: 10}){
name
metadata
}
我認為這是最后一個可能的選擇。
它不會給你完全的“無模式自由”,也許你正在尋找,但 IDK 知道其他方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.