Postgres 9.6 - 包含 json 数组的复杂查询 jsonb 字段

Postgres 9.6 - complex query jsonb field that consists array of jsons

我的 table 看起来像这样:

CREATE TABLE myjsontable(data JSONB NOT NULL);

INSERT INTO myjsontable VALUES ('[{"score":20 ,"category": 10 }, {"score":100 ,"category": 100 },{"score":500 ,"category": 50 }]');

INSERT INTO myjsontable VALUES ('[{"score":1000 ,"category": 40 }, {"score":30 ,"category": 50 },{"score":6000 ,"category": 100 }]');

INSERT INTO myjsontable VALUES ('[{"score":10 ,"category": 1 }, {"score":123 ,"category": 40 },{"score":1000 ,"category": 50 }]');

CREATE INDEX ON myjsontable USING GIN(data);

我只想获取 jsons[=13= 数组中特定 json 类别 X 得分高于 Y 的记录]

我所做的就是使用这样的包含:

SELECT * FROM myjsontable WHERE data @> '[{ "category": 10}]';

我希望我可以做一些简单的查询(比如 NoSQL..)

 SELECT * FROM myjsontable WHERE data @> '[{ "category": 10, "score": ">10" }]';

有什么方法可以实现简单但复杂的 where 子句,就像在我的字段是 json 的数组时给出的示例中那样?

由于类别和分数作为 json 对象存储在 json 数组中,首先必须取消嵌套数组,然后使用 json 访问器函数比较值where 子句。在转换为 int 之前需要将 json 转换为文本:

SELECT t.* 
FROM myjsontable t
CROSS JOIN JSONB_ARRAY_ELEMENTS(data) x
WHERE (x.value->>'category')::INT = 10 
  AND (x.value->>'score')::INT > 10

也可以使用 EXISTS 子句编写此查询。这个表述的意图稍微明确一些:

SELECT * FROM myjsontable 
WHERE EXISTS (SELECT TRUE FROM JSONB_ARRAY_ELEMENTS(data) x
              WHERE (value->>'category')::INT = 10 
                AND (value->>'score')::INT > 10)