我正在评估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
}
]
}
```
作为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.
真的很简单
SQL / JSON支持没有在v11中实现。
让我们希望它会在第12节出现。
您的用例有点模糊,但我认为PostgreSQL非常适合这种处理,特别是如果数据应该以关系模式结束。