JSONB для типа данных массива - PullRequest
0 голосов
/ 20 декабря 2018

В настоящее время у меня есть сеансы таблицы с действиями столбца (JSONB).

Я могу правильно сохранить массив из моего интерфейса в базу данных, используя array_to_jsonb(array value).

Структура моего массива (значение массива) выглядит следующим образом:

var arrayStructure = [
    {name: 'email client', check: false},
    {name: 'send contract', check: false}
]

В отличие от многих вопросов, которые я видел в SO об изменении JSONB илиобращаясь к определенным ключам, меня интересует только преобразование всех данных JSONB обратно в массив для внешнего интерфейса.

Мое временное исправление заключается в отображении массива и использовании JSON.parse () в Javascript для реструктуризации каждого объекта.в массиве.Я не могу использовать JSON.parse () для всего массива, так как он выдает ошибку.

Я ищу запрос, чтобы вернуть формат массива в тип данных JSONB.Я видел JSONB_SET, LATERAL и JSONB_ARRAY_ELEMENTS_TEXT.Но не таким способом, который работал, чтобы вернуть правильный массив.

Начинается как: JSONB в столбце действий в таблице с именами сеансов

Должен привести к: Запрос, который возвращает все строки, но сСтолбец действий (JSONB), преобразованный обратно в массив для внешнего интерфейса:

select session_id, session_name, someFunction or lateral here(actions) from sessions

Снимок экрана таблицы сеансов

Я пробовал подобные запросы:

SELECT 
   session_id, 
   actions::jsonb -> 'name' as name
FROM sessions;

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

Это половина правильного результата запроса:

select session_id, jsonb_array_elements_text(actions)
from sessions
group by session_id;

Что приводит к этому (обратите внимание только на результаты для session_id из 264): результат запроса

Теперь у меня есть объекты в их собственных строках, такие как:

 {"name": "some task", "check": "false} 

Когда для столбца действий требуется:

[ {name: "some task", check: false}, {name: "other task", check: true} ]

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

Шаги для создания настройки:

create table fakeSessions (
session_id serial primary key, 
name varchar(20), 
list jsonb
)

insert into fakeSessions(name, list)
VALUES(
'running',
'["{\"name\":\"inquired\",\"check\":false}", "{\"name\":\"sent online guide\",\"check\":false}", "{\"name\":\"booked!\",\"check\":false}"]'
)

insert into fakeSessions(name, list)
VALUES(
'snowboarding',
'["{\"name\":\"rental\",\"check\":false}", "{\"name\":\"booked ski passes\",\"check\":false}", "{\"name\":\"survey\",\"check\":false}"]'
)

Ближайший созданный мной запрос:

with exports as (
    select jsonb_array_elements_text(actions)::jsonb as doc from sessions
)
select array_agg(doc) from
exports, sessions
group by session_id;

Получите текстовые значения, а затем примените статистическую функцию к этим возвращаемым строкам.Просто не могу заставить select array_agg (doc) работать как положено.Скорее всего, потому что мне нужна другая функция в этом месте.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Я смог найти ответ, построив ваш запрос!Огромное спасибо.Запрос, который получил ожидаемый результат, был следующим:

with exports as (
    select session_id, jsonb_array_elements_text(actions)::jsonb as doc from sessions
)
select session_id, jsonb_agg(doc) from exports
group by session_id;

Я не использовал функцию jsonb_agg (), как только получил элементы.Разница для получения точного формата заключалась в использовании jsonb_array_elements_text::jsonb

0 голосов
/ 21 декабря 2018

Помогает ли это?

demo: db <> fiddle

SELECT
    jsonb_agg(elem) 
FROM
    sessions, jsonb_array_elements(actions) as elem
  1. jsonb_array_elements() расширяет массив jsonb в одну строку каждыйjsonb элемент
  2. jsonb_agg() объединяет эти jsonb элементы в один большой массив.
...