Postgres 11 Jsonpath 支持
Postgres 11 Jsonpath support
我正在评估 Postgres 是否适合解析大量相当复杂的 JSON 文档以提取和语义匹配实体,最终填充具有高度完整性的关系模式。
我发现使用 jsonpath 对处理这些文档非常有帮助,我发现 this article which suggested that Postgres 11 would have support of sorts. However, 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/JSON v11 中没有支持。
从 PostgreSQL v12 开始可用。
您的用例有点含糊,但我认为 PostgreSQL 非常适合这种处理,特别是如果数据应以关系模式结束。
作为 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.
真的很简单
我正在评估 Postgres 是否适合解析大量相当复杂的 JSON 文档以提取和语义匹配实体,最终填充具有高度完整性的关系模式。
我发现使用 jsonpath 对处理这些文档非常有帮助,我发现 this article which suggested that Postgres 11 would have support of sorts. However, 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/JSON v11 中没有支持。
从 PostgreSQL v12 开始可用。
您的用例有点含糊,但我认为 PostgreSQL 非常适合这种处理,特别是如果数据应以关系模式结束。
作为 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.