【问题标题】:PostgreSQL joining using JSONB with TypeORMPostgreSQL 使用 JSONB 和 TypeORM 加入
【发布时间】:2021-12-12 17:31:24
【问题描述】:

我有这个 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 join typeorm


    【解决方案1】:

    在 PostgreSQL 中有额外的索引类型 GIN 用于 JSONJSONB 类型。为获得最佳性能,您必须为此 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) 我想将样本数据(相同计数)插入到我的本地表中以进行测试和分析

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      • 2020-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多