So erstellen Sie einen Index für das JSON-Feld in Postgres 9.3

111

Wie erstelle ich in PostgreSQL 9.3 Beta 2 (?) Einen Index für ein JSON-Feld? Ich habe es mit dem ->für verwendeten Operator versucht, hstoreaber den folgenden Fehler erhalten:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

FEHLER: Datentyp json hat keine Standardoperatorklasse für die Zugriffsmethode "btree". HINWEIS: Sie müssen eine Operatorklasse für den Index angeben oder eine Standardoperatorklasse für den Datentyp definieren.

rlib
quelle
8
"Wo ist die Frage?" - Im Titel
Rlib
2
In Zukunft besuchen Sie bitte stackoverflow.com/tags/postgresql/info , den Abschnitt "Bessere Fragen stellen". Es könnte helfen, schneller bessere Antworten mit weniger nervigen Fragen zu erhalten.
Craig Ringer

Antworten:

184

Gefunden:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

Wie in den Kommentaren angegeben, ist der subtile Unterschied hier ->>statt ->. Ersteres gibt den Wert als Text zurück, letzteres als JSON-Objekt.

rlib
quelle
38
Nur für den Fall, dass Sie nach dem Unterschied suchen: Es ist ->>statt ->. Ersteres gibt den Wert als Text zurück, letzteres gibt ein JSON-Objekt zurück.
Daniel Rikowski
34
Die Doppelklammern sind ebenfalls wichtig.
Ron
11
@Jac_opo Es extrahiert sie jedoch alsTEXT . Wenn Sie Ganzzahlvergleiche anstelle von Zeichenfolgenvergleichen durchführen möchten, müssen Sie eine Umwandlung hinzufügen : ((info->>'name')::INT).
jpmc26
13
Wenn Sie einen Index für ein Feld in einem Unterobjekt Ihrer JSON-Spalte erstellen möchten, habe ich dank @DanielRikowski herausgefunden, dass ich dies tun muss. create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Wir müssen zuerst ->das JSON-Objekt und dann ->>den untergeordneten Objektwert als abrufen Text.
Corey Cole