jsquery

用于内省 JSONB 数据类型的查询类型

概览

扩展包名版本分类许可证语言
jsquery1.2FEATPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
2770jsquery-
相关扩展pg_graphql pg_jsonschema plv8 jsonb_plperl jsonb_plpython3u pg_net pg_summarize age

版本

类型仓库版本PG 大版本包名依赖
EXTPGDG1.21817161514jsquery-
RPMPGDG1.21817161514jsquery_$v-
DEBPGDG1.21817161514postgresql-$v-jsquery-
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
d12.aarch64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
d13.x86_64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
d13.aarch64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
u22.x86_64
u22.aarch64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
u24.x86_64
u24.aarch64
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2
PGDG 1.2

安装

您可以直接安装 jsquery 扩展包的预置二进制包,首先确保 PGDG 仓库已经添加并启用:

pig repo add pgdg -u          # 添加 PGDG 仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install jsquery;          # 当前活跃 PG 版本安装
pig ext install -y jsquery -v 18  # PG 18
pig ext install -y jsquery -v 17  # PG 17
pig ext install -y jsquery -v 16  # PG 16
pig ext install -y jsquery -v 15  # PG 15
pig ext install -y jsquery -v 14  # PG 14
dnf install -y jsquery_18       # PG 18
dnf install -y jsquery_17       # PG 17
dnf install -y jsquery_16       # PG 16
dnf install -y jsquery_15       # PG 15
dnf install -y jsquery_14       # PG 14
apt install -y postgresql-18-jsquery   # PG 18
apt install -y postgresql-17-jsquery   # PG 17
apt install -y postgresql-16-jsquery   # PG 16
apt install -y postgresql-15-jsquery   # PG 15
apt install -y postgresql-14-jsquery   # PG 14

创建扩展

CREATE EXTENSION jsquery;

用法

jsquery: 用于 jsonb 检索的数据类型

JsQuery 提供了一种 JSONB 数据查询语言,类似于 tsquery 之于全文搜索的作用。它提供了一种简洁的方式来搜索嵌套对象和数组,并支持通过 GIN 建立索引。

运算符

运算符描述
@@匹配运算符:测试 jsonb 值是否匹配 jsquery 表达式

查询语法

表达式遵循 路径 运算符 值 的模式:

二元运算符:

  • =(相等)、>>=<<=(比较)
  • IN(列表成员)
  • &&(重叠)、@>(包含)、<@(被包含)

一元运算符:

  • = *(存在性检查)
  • IS ARRAYIS NUMERICIS OBJECTIS STRINGIS BOOLEAN(类型检查)

路径表达式

符号含义
#任意数组索引
#N特定数组索引 N
%任意对象键
*任意键/索引序列
@#数组/对象长度
$整个文档

“全部"语义(所有元素必须匹配):

  • #: – 所有数组元素
  • %: – 所有对象键
  • *: – 所有嵌套路径

示例

简单值匹配:

SELECT * FROM jsonb_table WHERE data @@ 'name = "Alice"';
SELECT * FROM jsonb_table WHERE data @@ 'age > 21';
SELECT * FROM jsonb_table WHERE data @@ 'tags.#: IS STRING';

逻辑组合:

SELECT * FROM jsonb_table WHERE data @@ 'a = 1 AND (b = 2 OR c = 3)';

数组元素匹配(查找同时满足两个条件的数组元素):

SELECT * FROM jsonb_table WHERE data @@ '#(a = 1 AND b = 2)';

对象键范围匹配:

SELECT * FROM jsonb_table WHERE data @@ '%($ >= 10 AND $ <= 20)';

GIN 索引

两种运算符类适用于不同的查询模式:

-- 最适合已知完整路径时的范围和精确搜索
CREATE INDEX ON jsonb_table USING gin (data jsonb_path_value_ops);

-- 最适合精确值搜索;支持路径中使用 % 和 *
CREATE INDEX ON jsonb_table USING gin (data jsonb_value_path_ops);

索引使用的优化提示:

SELECT * FROM jsonb_table WHERE data @@ 'x = 1 /*-- index */ AND y = 2';
SELECT * FROM jsonb_table WHERE data @@ 'x = 1 /*-- noindex */ AND y = 2';

通过 CHECK 约束进行模式校验

CREATE TABLE documents (
    id serial PRIMARY KEY,
    data jsonb CHECK (data @@ 'name IS STRING AND similar_ids.#: IS NUMERIC'::jsquery)
);

最后修改 2026-03-14: update extension metadata (953cbd0)