簡體   English   中英

使用 Hasura 在 postgresql 中搜索 jsonb 字段

[英]Search jsonb fields in postgresql with Hasura

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

它看起來在 PostgreSQL 本身中是可能的, 我怎樣才能做到小於、大於 JSON Postgres 字段?

在 postgres 中,我正在存儲一張表

資產

  • 名稱:字符串
  • 版本:int
  • 元數據:jsonb

元數據看起來像這樣。

{'長度':5}

我能夠使用_contains找到完全匹配的asset

{
  asset(where:{metadata : {_contains : {length: 5}}}){
    name
    metadata
  }
}

我希望能夠找到長度超過 10 的asset

我試過了:

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

A. 直接在 graphql 級別上做的可能性

Hasura 文檔:JSONB 運算符(_contains、_has_key 等)僅提及 4 個運算符:

_contains、_contained_in、_has_key、_has_keys_any 和 _has_keys_all 運算符用於基於 JSONB 列進行過濾。

所以直接回答你的問題:不。在hasura的graphql級別上是不可能的。

(至少現在還不可能。誰知道呢:也許在未來的版本中會實現更多的運算符。)

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 函數

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM