Postgresql
具有動態鍵的 JSON 欄位索引
我在 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
和作用於 JSONBGIN
:jsonb_path_ops
和jsonb_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'