Utilisation des index dans le tableau json dans PostgreSQL

faisant référence à la question originale de stackoverflow , j'essaie d'appliquer les index gin aux clés dans les objets d'un tableau dans Postgres 9.4 mais je ne reçois pas les résultats comme indiqué dans la première réponse.

pouvez-vous rectifier l'erreur?

les étapes que j'ai suivies ont été écrites ci-dessous.

Partie 1: Création de la table et index

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"}]');

Partie 2: La Requête

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

Cette requête donne des résultats vides.

J'ai aussi essayé d'utiliser les index de GIN jsonb_path_ops .

Alternative index et d'interroger:

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)
4
demandé sur Community 2015-04-29 16:27:30

1 réponses

cet exemple JSONB spécifique de la réponse originale 151990920" manquait la couche de tableau [] autour de l'objet non primitif pour la requête de confinement. Il a depuis été corrigé.

le comportement documenté pour PostgreSQL 9.4.x JSONB containing and Existence states:

le principe général est que l'objet contenu doit correspondre à l'objet contenant structure et contenu des données

...

comme exception spéciale au principe général que les structures doivent correspondre, un tableau peut contenir une valeur primitive

L'exception spéciale nous permet de faire ce qui suit:

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

nous pouvons interroger pour le confinement en utilisant le principe général:

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

nous pouvons également faire des requêtes pour le confinement en utilisant le exception spéciale puisque le tableau contient des types primitifs:

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

il y a 4 types primitifs qui permettent aux requêtes de confinement et d'existence sur les tableaux de fonctionner:

  1. chaîne
  2. nombre
  3. boolean
  4. null

étant donné que l'exemple que vous avez mentionné dans votre question concerne des objets imbriqués dans un tableau, nous ne peuvent bénéficier de l'exception spéciale mentionnée ci-dessus:

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"}]');

nous pouvons interroger pour le confinement en utilisant le principe général:

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

les Objets ne sont pas considérés comme un type primitif, de sorte que la requête suivante pour le confinement n'est pas admissible à l'exception particulière et, par conséquent, ne fonctionne pas:

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)
7
répondu potatosalad 2017-05-23 11:54:07