【问题标题】:Indexing PostgreSQL JSONB Array Elements索引 PostgreSQL JSONB 数组元素
【发布时间】:2019-04-10 13:42:49
【问题描述】:

如标题所述,如何索引 JSONB 数组?

内容看起来像......

["some_value", "another_value"]

我可以很容易地访问像...这样的元素

SELECT * FROM table WHERE data->>0 = 'some_value';

我创建了一个这样的索引...

CREATE INDEX table_data_idx ON table USING gin ((data) jsonb_path_ops);

当我运行 EXPLAIN 时,我仍然看到它按顺序扫描...

索引文本元素数组时缺少什么?

【问题讨论】:

  • 你想用那个索引或其他东西支持条件data->>0 = '...'吗?
  • 我想支持动态长度数组中可能存在的每个元素。

标签: postgresql jsonb database-indexes


【解决方案1】:

如果您想通过索引支持该精确查询,则索引必须如下所示:

CREATE INDEX ON "table" ((data->>0));

如果你想使用你拥有的索引,你不能将搜索限制在一个特定的数组元素(在你的情况下是第一个)。可以加快在数组中搜索some_valueanywhere

SELECT * FROM "table"
WHERE data @> '["some_value"]'::jsonb;

【讨论】:

    【解决方案2】:

    我最终采取了不同的方法。我仍然无法使用 JSONB 类型进行搜索,因此我最终将我的列切换为 varchar ARRAY

    CREATE TABLE table (
        data varchar ARRAY NOT NULL
    );
    
    CREATE INDEX table_data_idx ON table USING GIN (data);
    
    SELECT * FROM table WHERE data @> '{some_value}';
    

    这有效并且正在使用索引。


    我认为我的 JSONB 方法存在问题,因为该元素实际上嵌套得更深,并且被视为文本。

    data->'some_key'->>'array_key'->>0

    每次我尝试搜索时,都会收到各种无效令牌错误和其他类似的东西。

    【讨论】:

    • 也许您应该考虑完全规范化您的模型?
    • 我通过将需要访问的元素移到 varchar ARRAY 类型的顶级列来解决了这个问题。现在一切都很好。
    • 您可以将jsonb 用于这样的查询:WHERE data @> '{"some_key": {"array_key": ["some_value"] } }'::jsonb
    猜你喜欢
    • 2017-09-11
    • 2017-04-12
    • 1970-01-01
    • 2020-03-25
    • 2020-11-11
    • 2015-08-20
    • 1970-01-01
    • 2022-12-08
    • 2015-08-15
    相关资源
    最近更新 更多