【问题标题】:Can I index and search nested object keys in JSON on postgres?我可以在 postgres 上索引和搜索 JSON 中的嵌套对象键吗?
【发布时间】:2021-11-19 19:21:13
【问题描述】:

如果我有一个名为configurations 的表,其中行包含一个名为datajsonb 列,其值类似于以下内容:

{
    "US": {
        "1234": {
            "id": "ABCD"
        }
    },
    "CA": {
        "5678": {
            "id": "WXYZ"
        }
    }
}

我希望能够编写类似于以下内容的查询:

select * from configurations where data->'$.*.*.id' = 'WXYZ'

(请注意:我知道上面的 SQL 是不正确的,把它当作伪。)

问题:

  • 执行我上面写的查询的正确语法是什么?
  • 我需要创建什么类型的索引来确保我不会使用上一个问题中的任何查询来扫描整个表?

【问题讨论】:

  • 为什么不规范化你的数据模型?
  • 因为此列中的值在结构上会有所不同,并代表来自外部系统的信息。

标签: json postgresql indexing jsonb


【解决方案1】:

你可以把你的伪代码变成真正的jsonpath代码:

select * from configurations where data @@ '$.*.*.id == "WXYZ"'

这可以在“数据”上使用默认的 gin 索引:

create index on configurations using gin (data);

【讨论】:

  • 很好,我会试一试!我应该使用任何特定语法来创建 gin 索引吗?
  • 感谢您的更新!不知道 gin 索引是否可以和其他非 json 列合并?
  • 嗯,我对查询 select * from configurations where data @@ '$.*.*.id' is not null; 的解释似乎没有使用我创建的 gin 索引。仍然显示“Seq scan”。
  • 如果表很小,或者如果它认为有太多行会匹配,它不会发现索引很有吸引力。这里有这两种情况吗?在我手中,它不仅被使用,而且比我想象的要高效得多。
  • 可以通过位图扫描与其他索引结合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-27
  • 2017-07-19
  • 1970-01-01
  • 2018-09-10
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多