Postgresql json выбирает из значений во втором слое хранения массивов

У меня есть столбец jsonb data, содержащий дерево, например json, например:

{
    "libraries":[
        {    
            "books":[
                {
                    "name":"mybook",
                    "type":"fiction"
                },
                {
                    "name":"yourbook",
                    "type":"comedy"
                }
                {
                    "name":"hisbook",
                    "type":"fiction"
                }
            ]
        }
    ]
}

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

Я смог сделать это с помощью jsonb_array_elements запроса соединения, но, насколько я понимаю, это не будет оптимизировано с использованием индекса GIN. мой запрос

select books->'name'
from data,
     jsonb_array_elements(data->'libraries') libraries,
     jsonb_array_elements(libraries->'books') books,
where books->>'type'='grading'

person Berethor    schedule 19.08.2015    source источник
comment
Есть работа над общим поиском по пути json, но, AFAIK, пока ничего в 9.4 или 9.5 за пределами json_extract_path, который не обрабатывает записи с подстановочными знаками, совпадения шаблонов и т. Д., Пока нет.   -  person Craig Ringer    schedule 20.08.2015
comment
@Berethor Просто интересно, придумали ли вы когда-нибудь, как это исправить.   -  person mkohram    schedule 24.02.2016


Ответы (1)


Если пример данных, который вы показываете, является типом данных, который является общим в вашем JSON, я бы предположил, что вы, возможно, неправильно настраиваете что-то.

Почему бы не сделать таблицу библиотеки и таблицу книги и вообще не использовать JSON, похоже, JSON здесь не лучший выбор.

CREATE TABLE library
(
   id serial, 
   name text
);

CREATE TABLE book
(
   isbn BIGINT,
   name text,
   book_type text
);

CREATE TABLE library_books
(
   library_id integer,
   isbn BIGINT
)

select book.* from library_books where library_id = 1;
person Michael Robellard    schedule 24.08.2015
comment
Приведенный выше пример - это всего лишь пример. на самом деле json был выбран, потому что данные здесь очень динамичны и не только включают книги или библиотеки (которые также являются суррогатами, которые я использовал для упрощения примера) - person Berethor; 31.08.2015