JSONB вложенный запрос postgres рельсы - PullRequest
0 голосов
/ 06 января 2019

У меня есть столбец jsonb, где я храню некоторые данные фильтрации. Структура, в которой я храню данные в столбце, выглядит следующим образом:

[
      {
        "filter":[
            {
                "key":"first_name",
                "condition":"has_any_value"
            },
            {
                "key":"count_of",
                "value":"1",
                "event_id":"130",
            }
        ]
     },
     {
        "filter":[
            {
                "key":"count_of",
                "value":"1",
                "event_id":"130"
            }
        ],
        "filter_operator":"AND"
     },
     {
        "filter":[
            {
                "key":"user_id",
                "value":"12",
                "condition":"equals"
            },
            {
                "key":"count_of",
                "value":"112",
                "event_id":"130"
        ],
        "filter_operator":"OR"
     }
]

Мне нужно запросить, содержит ли фильтр JSON конкретный идентификатор события (который может существовать в любых данных "filter"), но я не могу найти способ запроса, если в структуре существует конкретный идентификатор события У меня есть (Массив -> каждый filter данные -> Любой хэш может содержать идентификатор события). Я использую Postgres 10.1. Кто-нибудь может помочь получить это?

1 Ответ

0 голосов
/ 06 января 2019

Одна вещь, прежде чем публиковать возможный подход: имейте в виду, что это будет крайне плохо с точки зрения производительности, так как это всегда потребует от вас полного сканирования таблицы. Возможно, что кто-то с большим опытом работы с БД, чем я, знает умный способ добавить индекс, но с точки зрения удобства сопровождения все же может быть предпочтительнее использовать немного другой подход.

Сказав это, вот мой подход.

with filters as (
  select id, jsonb_array_elements(
    jsonb_array_elements(my_jsonb_column)->'filter') as filter
    from my_table
)
select distinct id from filters where filter @> '{"event_id":"130"}'::jsonb

Это даст вам идентификатор всех записей, включая идентификатор события.

Вот скрипка для демонстрации: https://www.db -fiddle.com / f / hMSjM675cqQQnb734V4zne / 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...