Поддержка Postgres 11 Jsonpath - PullRequest
       8

Поддержка Postgres 11 Jsonpath

0 голосов
/ 31 августа 2018

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

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

Мой вопрос: будет ли поддержка? Кроме того, этот тип обработки подходит для Postgres вообще? (возможно использовать Lucene, MongoDb для анализа и сопоставления, а затем импортировать в реляционные таблицы Postgres как-нибудь?)

Примером данных могут быть:

`` `

{
    "event_classes": [
        {
            "name": "American Football", 
            "url": "/sportsapi/v2/american-football", 
            "id": 27
        }, 
        {
            "name": "Athletics", 
            "url": "/sportsapi/v2/athletics", 
            "id": 48
        }, 
        {
            "name": "Aussie Rules", 
            "url": "/sportsapi/v2/aussie-rules", 
            "id": 10000062
        }, 
        {
            "name": "Badminton", 
            "url": "/sportsapi/v2/badminton", 
            "id": 10000069
        }, 
        {
            "name": "Baseball", 
            "url": "/sportsapi/v2/baseball", 
            "id": 5000026
        }
    ]
}

`` `

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

В качестве общей точки зрения SQL / Path будет более кратким методом запроса структуры данных JSONB. Он будет компилироваться до традиционных методов запросов JSONB. Это делает его синтаксическим анализатором, предоставляя стандартный синтаксис.

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

Узнать, содержит ли этот массив {"foo":2}, просто.

WITH t(jsonb) AS ( VALUES ('[{"foo":2, "qux":42},{"bar":2},{"baz":4}]'::jsonb) )
SELECT *
FROM t
WHERE jsonb @> '[{"foo":2}]';

Однако значительно сложнее получить значение qux с учетом вышеизложенного.

WITH t(jsonb) AS ( VALUES ('[{"foo":2, "qux":42},{"bar":2},{"baz":4}]'::jsonb) )
SELECT e->'qux'
FROM t
CROSS JOIN LATERAL jsonb_array_elements(jsonb) AS a(e)
WHERE t.jsonb @> '[{"foo":2}]'
  AND e @> '{"foo":2}';

Но это не конец света. Это действительно хороший синтаксис SQL. Это просто не JavaScript. С JSON PATH вы сможете что-то сделать,

SELECT t.json _ '$.[@.foo == 2].qux'
FROM t
WHERE t.json _ '$.[@.foo == 2]';

Где _ - это какой-то оператор JSONPATH. Кроме того, вы всегда можете создать фактическую хранимую процедуру JavaScript на сервере и запустить ее с помощью узла. Это очень просто с pl/v8.

0 голосов
/ 31 августа 2018

Поддержка SQL / JSON не появилась в v11.

Будем надеяться, что это произойдет в v12.

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

...