是否可以使用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-functionCREATE FUNCTION get_assets(min_length int DEFAULT 0)
RETURNS SETOF asset
LANGUAGE SQL
STABLE
AS $$
SELECT * FROM asset
WHERE
(metadata->>'length')::int > min_length;
$$;
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
}
我想那是最后的选择了。
它不会给你完全的"无模式自由"。也许你正在寻找,但我知道还有其他方法。