Postgresql json从数组包含的第二层中的值中选择

Postgresql json从数组包含的第二层中的值中选择,postgresql,postgresql-9.4,jsonb,Postgresql,Postgresql 9.4,Jsonb,我有一个jsonb列“data”,其中包含类似json的树,例如: { "libraries":[ { "books":[ { "name":"mybook", "type":"fiction" }, { "name":"you

我有一个jsonb列“data”,其中包含类似json的树,例如:

{
    "libraries":[
        {    
            "books":[
                {
                    "name":"mybook",
                    "type":"fiction"
                },
                {
                    "name":"yourbook",
                    "type":"comedy"
                }
                {
                    "name":"hisbook",
                    "type":"fiction"
                }
            ]
        }
    ]
}
我希望能够使用查询进行索引,根据类型从缩进的图书JSON中选择一个值。 所以所有的书名都是虚构的

我可以使用jsonb_数组_元素和联接查询来实现这一点,但据我所知,使用GIN索引无法优化这一点。 我的问题是

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

如果您显示的示例数据是JSON中常见的数据类型,我建议您可能设置错误

为什么不制作一个library表和book表,而不使用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;

在一般的json路径查询搜索方面有一些工作,但除了json_extract_path之外,在9.4或9.5中还没有其他内容,json_extract_path不处理通配符条目、模式匹配等。@Beretor只是想知道您是否找到了解决方法。上面的示例就是这样一个示例。实际上,之所以选择json,是因为这里的数据非常动态,并且不仅包括书籍或库,它们也是我用来简化示例的代理