使用Hasura在postgresql中搜索jsonb字段



是否可以使用hasura在jsonb字段中进行更大的搜索?

它看起来是可能的在PostgreSQL本身,我怎么能做小于,大于JSON PostgreSQL字段?

在postgres中,我存储一个表

资产
  • 名称:字符串
  • 版本:int
  • 元数据:jsonb

元数据是这样的

{"长度":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中不可能在图形级别上执行。

(至少现在还不可能。谁知道呢:也许在未来的版本中会实现更多的操作符。)

B。使用派生视图

但是还有另一种方法,在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
}

C。使用SETOF-functions h1>1。创建SETOF-function
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
}

我想那是最后的选择了。

它不会给你完全的"无模式自由"。也许你正在寻找,但我知道还有其他方法。

最新更新