PostgreSQL JSONB GIN Index Containment
Query JSONB documents with containment operators backed by a GIN index, comparing jsonb_path_query for complex predicates.
Code
-- PostgreSQL GIN 索引让 @> 包含查询走索引
CREATE INDEX idx_events_payload
ON events USING gin (payload jsonb_path_ops);
-- 包含运算符:文档包含给定结构即命中
SELECT
event_id,
payload->>'kind' AS kind,
payload->'context'->>'region' AS region
FROM events
WHERE payload @> '{"context": {"region": "eu"}}'
ORDER BY created_at DESC
LIMIT 20;
-- 顶层数组包含:tags 数组含指定值
SELECT event_id, payload->'tags' AS tags
FROM events
WHERE payload->'tags' @> '["checkout"]'
AND payload ? 'priority'; -- 顶层键存在性
-- jsonpath:复杂条件的结构化表达
SELECT
event_id,
jsonb_path_query_first(
payload,
'$.metrics[*] ? (@.name == "latency_ms" && @.value > 500).value'
) AS slow_latency
FROM events
WHERE jsonb_path_exists(
payload,
'$.metrics[*] ? (@.name == "latency_ms" && @.value > 500)'
);Report a problem with this exampleOpens a pre-filled issue on GitHub.