使用带有 TypeORM 的 JSONB 的 PostgreSQL 连接

PostgreSQL joining using JSONB with TypeORM

我有这个SQL

CREATE TABLE product(id SERIAL PRIMARY KEY, name text, categories JSONB);

INSERT INTO product(name, categories) VALUES
   ('prouct1', '{"ids":[4,5]}'),
   ('prouct2', '{"ids":[5,6]}'),
   ('prouct3', '{"ids":[7]}');

CREATE TABLE category(id bigint, rootid bigint);

INSERT INTO category(id, rootid) VALUES
   (1, null),
   (2, null),
   (3, null),
   (4, 1),
   (5, 2),
   (6, 1),
   (7, 3);

我想用 TypeORM 做这个查询。但是我不知道如何使 jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE 成为 TypeORM 的一部分。

SELECT p.id, p.name, p.categories
FROM product p 
INNER JOIN jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;

或者,我正在尝试另一个查询。但是当我输入 jsonb_array_elements_text(categories->'ids') 时它太慢了。为什么会这样?

SELECT p.id, p.name, p.categories
FROM product p 
INNER JOIN (SELECT id, jsonb_array_elements_text(categories->'ids') categoryid FROM product) pc ON p.id = pc.id
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;

在 PostgreSQL 中,JSONJSONB 类型有额外的索引类型 GIN。为获得最佳性能,您必须为此 JSON 字段创建索引。 例如:

CREATE INDEX product_category_json_index ON product USING gin (categories jsonb_path_ops);

我为您写了一个替代查询:

select main.*, cat.* from 
(
    select p.*, jsonb_array_elements((categories->'ids'))::integer as category_id 
    from product p
) main 
inner join examples.category cat on cat.id = main.category_id;

我想获得更详细的信息,对于这些表,如果你知道那么请告诉我这两个表中有多少条记录(productcategory) 我想将示例数据(相同计数)插入到我的本地表中以进行测试和分析