使用 Hasura 在 postgresql 中搜索 jsonb 字段
Search jsonb fields in postgresql with Hasura
是否可以使用 hasura 在 jsonb 字段中进行大于搜索?
在 PostgreSQL 本身看来是可行的,
在 postgres 中我存储了一个 table
资产
- 名称:字符串
- 版本:整数
- 元数据:jsonb
元数据如下所示。
{'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 知道其他方式。
是否可以使用 hasura 在 jsonb 字段中进行大于搜索?
在 PostgreSQL 本身看来是可行的,
在 postgres 中我存储了一个 table
资产
- 名称:字符串
- 版本:整数
- 元数据:jsonb
元数据如下所示。
{'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 知道其他方式。