加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在PostgreSQL中使用json数组中的索引

发布时间:2020-12-13 16:34:26 所属栏目:百科 来源:网络整理
导读:参考 original stackoverflow question,我试图将金币索引应用于Postgres 9.4中数组对象中的键,但我没有得到第一个答案中所述的结果. 你能否解决这个错误? 我遵循的步骤如下. 第1部分:创建表和索引 CREATE TABLE tracks (id serial,artists jsonb);CREATE I
参考 original stackoverflow question,我试图将金币索引应用于Postgres 9.4中数组对象中的键,但我没有得到第一个答案中所述的结果.

你能否解决这个错误?

我遵循的步骤如下.

第1部分:创建表和索引

CREATE TABLE tracks (id serial,artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
INSERT INTO tracks (id,artists) VALUES (1,'[{"name": "blink-182"}]');
INSERT INTO tracks (id,artists) VALUES (2,'[{"name": "The Dirty Heads"},{"name": "Louis Richards"}]');

第2部分:查询

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)

此查询提供空结果.
我还尝试使用jsonb_path_ops GIN索引.

替代索引和查询:

DROP INDEX tracks_artists_gin_idx;
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING  gin (artists jsonb_path_ops);
SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)
来自 original answer的这个特定的jsonb示例在包含查询的非基本对象周围缺少数组layer [].它已被修复.

PostgreSQL 9.4.x jsonb Containment and Existence记录的行为指出:

The general principle is that the contained object must match the containing object as to structure and data contents

As a special exception to the general principle that the structures must match,an array may contain a primitive value

特殊例外允许我们执行以下操作:

CREATE TABLE tracks (id serial,artistnames jsonb);
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);
INSERT INTO tracks (id,'["blink-182"]');
INSERT INTO tracks (id,'["The Dirty Heads","Louis Richards"]');

我们可以使用一般原则查询遏制:

SELECT * FROM tracks WHERE artistnames @> '["The Dirty Heads"]';
 id |              artistnames              
----+---------------------------------------
  2 | ["The Dirty Heads","Louis Richards"]
(1 row)

我们还可以使用特殊异常查询包含,因为数组包含基本类型:

SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"';
 id |              artistnames              
----+---------------------------------------
  2 | ["The Dirty Heads","Louis Richards"]
(1 row)

有4种原始类型允许对数组进行包含和存在查询:

>字符串
>数量
>布尔值
> null

由于您在问题中提到的示例是处理嵌套在数组中的对象,因此我们不符合上述特殊异常的条件:

CREATE TABLE tracks (id serial,{"name": "Louis Richards"}]');

我们可以使用一般原则查询遏制:

SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
 id |                          artists                          
----+-----------------------------------------------------------
  2 | [{"name": "The Dirty Heads"},{"name": "Louis Richards"}]
(1 row)

对象不被视为基本类型,因此以下对包含的查询不符合特殊异常的条件,因此不起作用:

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读