Postgres 11 Jsonpath支持

问题描述 投票:3回答:2

我正在评估Postgres是否适合解析一些非常复杂的JSON文档以提取和语义匹配实体,最终填充具有高完整性的关系模式。

我发现使用jsonpath非常有用这些文件并找到this article,这表明Postgres 11会得到各种支持。然而,the docs根本没有提到这一点

我的问题是支持即将到来吗?此外,这种处理是否适合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
        }
    ]
}

```

json postgresql semantics jsonpath
2个回答
1
投票

作为SQL / Path的一般要点,查询JSONB数据结构将是一种更简洁的方法。它将编译成传统的查询JSONB的方法。这使它成为解析器功能,提供标准语法。

Imho,标准语法实质上更好,并为将来的优化提供了空间,但是任何关于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存储过程并使用node运行它。用pl/v8.真的很简单


3
投票

SQL / JSON支持没有在v11中实现。

让我们希望它会在第12节出现。

您的用例有点模糊,但我认为PostgreSQL非常适合这种处理,特别是如果数据应该以关系模式结束。

© www.soinside.com 2019 - 2024. All rights reserved.