Postgrest api - Отбор по в массиве jsonb

Есть таблица

users
- name text
- objects jsonb

name     objects
alik     [2,3,4]
tolik    [45,78,34]
katy     [2,4,6] 

Использую postgrest api, нужно получить только те записи у которых значение в массиве jsonb совпадает с 2

query = "/users?objects@>[2]";

выдает все записи, а нужно

name     objects
alik     [2,3,4]
katy     [2,4,6]

также есть таблица types

name -text     objects - jsonb
tapok           [{"id":1, "total":10},{"id":2, "total":50},{"id":3, "total":10}]
shot           [{"id":5, "total":10},{"id":7, "total":50},{"id":2, "total":10}]
body           [{"id":3, "total":10},{"id":2, "total":50},{"id":1, "total":10}]

Как правильно записать запрос с отбором по id в колонке objects?

const id = 2;
query = "/types?objects->>id=eq."+id";

неработает.


Ответы (1 шт):

Автор решения: Ainar-G

Для начала обязательное предупреждение, что если у вас часто возникает надобность в подобных операциях, то лучше нормализовать схему далее.

Вы не указали версию. В PostgreSQL версии 12 и позже можно воспользоваться запросом SQL/JSON Path:

SELECT *
  FROM users
 WHERE objects @? '$[*] ? (@ == 2)'
;

Так как у вас PostgREST, а он не поддерживает синтаксис SQL/JSON Path, вам придётся использовать несовместимый язык из предыдущих версий PostgreSQL:

SELECT *
  FROM users
 WHERE objects @> CAST('[2]' AS JSONB)
;

Если судить по документации, это у вам будет что-то типа:

/users?objects=cs.{2}
→ Ссылка