Как искать с помощью оператора jsonb @ ›в сервисе Feathers.js / knex

Используя перьяJs / Knex и Postgresql.

(Упрощенный) SQL-запрос таков:

SELECT * FROM projects WHERE team_members @> '{"members":[{"id": 1}]}';

Как я могу реализовать этот запрос в сервисе пер / кнекс? Все, что я пробовал, выдает Bad Request ошибку.

Я попытался использовать rawQuery, но не смог заставить его работать. Я пробовал использовать обычный запрос, но по умолчанию он использует оператор = вместо @> (как обычно).

Я рассматриваю возможность создания отдельной службы на сервере, но мне интересно, нет ли более простого способа сделать это. Я только начал с перьев, я уверен, что что-то упустил, и это должно быть очень просто.


person SharpBCD    schedule 07.05.2019    source источник


Ответы (1)


У Knex нет какой-либо конкретной поддержки для этого оператора. Objection.js, созданный поверх knex, поддерживает операторы jsonb, поэтому его будет проще использовать в долгосрочной перспективе https://vincit.github.io/objection.js/api/query-builder/find-methods.html#wherejsonsupersetof.

При этом с помощью knex вы можете сделать это следующим образом:

knex('projects').whereRaw(`?? @> ?::jsonb`, [
  'team_members', 
  JSON.stringify({members:[{id: 1}]})
])

Что создает следующий запрос:

{ method: 'select',
  bindings: [ '{"members":[{"id":1}]}' ],
  sql: 'select * from "projects" where "team_members" @> ?::jsonb' }
person Mikael Lepistö    schedule 07.05.2019
comment
Отличный ответ, спасибо. Просто я не фанат ORM вообще. Я предпочитаю писать чистый SQL и оптимизировать его для конкретной БД. Что вы посоветуете в таком случае? Должен ли я написать собственный сервис в Feathers и просто запустить необработанный запрос? Может быть, вернуть результат таким же образом для единообразия, даже если в данный момент я не уверен, как реализовать разбиение на страницы - например. - person SharpBCD; 07.05.2019