使用 Hasura 在 postgresql 中搜索 jsonb 字段

Search jsonb fields in postgresql with Hasura

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

在 PostgreSQL 本身看来是可行的,

在 postgres 中我存储了一个 table

资产

元数据如下所示。

{'length': 5}

我能够使用 _contains.

找到完全匹配的 asset
{
  asset(where:{metadata : {_contains : {length: 5}}}){
    name
    metadata
  }
}

我希望能够找到长度超过 10 的 asset

我试过了:

{
  asset(where:{metadata : {_gt : {length: 10}}}){
    name
    metadata
  }
}

一个。可以直接在 graphql 级别上进行

Hasura documentation: JSONB operators (_contains, _has_key, etc.) 仅提及 4 个运算符:

The _contains, _contained_in, _has_key, _has_keys_any and _has_keys_all operators are used to filter based on JSONB columns.

所以直接回答你的问题:没有。在 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

We don't have operators like that for JSONB (might be solved by something like #5211) but you can use a view or computed field to flatten the text field from the JSONB column into a new column and then do a like on that.

食谱是:

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 查询中使用它 table

例如

query{
  assets(where: {meta_len: {_gt:10}}){
   name
   metadata
}

C。使用 SETOF 函数

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 知道其他方式。