Postgresql

具有動態鍵的 JSON 欄位索引

  • January 25, 2018

我在 PG 9.5 上,我有一個表 Visitor(id, data::json)

例子:

Visitor(id: 1, data: {name: 'Jack', age: 33, is_user: true })

我想執行如下查詢

  • 給我所有名叫 Jack 且年齡 > 25 的訪客
  • 給我所有作為使用者的訪問者,但未指定名稱(鍵不在 json 中)

數據列內的鍵是使用者指定的,因此是動態的。

在這種情況下,哪個索引最有意義?

將您的 JSON 列更改為 jsonb 並嘗試在數據欄位上使用 gin 索引,例如:

create index ginner on Visitor using gin(data);

它們的創建速度可能很慢而且很大,但允許任意查詢。這是一個展示:

https://blog.codeship.com/unleash-the-power-of-storing-json-in-postgres/

給我所有名叫 Jack 且年齡 > 25 的訪客

給我所有作為使用者的訪問者,但未指定名稱(鍵不在 json 中)

我假設您已經閱讀過文件。答案是你不能這樣做。有兩種類型的索引類可以使用GIST和作用於 JSONB GINjsonb_path_opsjsonb_ops(預設值)。

CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
CREATE INDEX idxgin ON api USING GIN (jdoc);

使用jsonb_ops我相信你可以測試一個值的不存在。但是,除了任意遏制之外,您都無法測試任何內容。來自 JSONB 索引的文件

jsonb 的預設 GIN 運算符類支持使用頂級鍵存在運算符 ?、?& 和 ?| 的查詢 運算符和路徑/值存在運算符@>。

在JSON-function 文件中找出這些運算符對類型的作用

如果您需要知道 Jack 是否超過 25 歲。您必須在data->>'age'

引用自:https://dba.stackexchange.com/questions/153111