Jak stworzyć indeks na polu JSON w Postgres?

111

Jak w PostgreSQL 9.3 Beta 2 (?) Utworzyć indeks w polu JSON? Wypróbowałem to za pomocą ->operatora używanego do, hstoreale otrzymałem następujący błąd:

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

BŁĄD: typ danych json nie ma domyślnej klasy operatora dla metody dostępu „btree” WSKAZÓWKA: Należy określić klasę operatora dla indeksu lub zdefiniować domyślną klasę operatora dla typu danych.

rlib
źródło
8
"Gdzie jest pytanie?" - W tytule
rlib
2
W przyszłości zajrzyj na stackoverflow.com/tags/postgresql/info , sekcję „zadawanie lepszych pytań”; może pomóc w szybszym uzyskaniu lepszych odpowiedzi i mniejszej liczbie irytujących pytań.
Craig Ringer

Odpowiedzi:

186

Znaleziony:

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

Jak stwierdzono w komentarzach, subtelna różnica jest tutaj ->>zamiast ->. Pierwsza zwraca wartość jako tekst, druga jako obiekt JSON.

rlib
źródło
39
Na wszelki wypadek, gdybyś szukał różnicy: jest ->>zamiast ->. Pierwsza zwraca wartość jako tekst, druga zwraca obiekt JSON.
Daniel Rikowski
35
Ważne są również podwójne nawiasy.
Ron,
11
@Jac_opo Wyodrębnia je takTEXT , jakby. Jeśli chcesz zrobić porównanie całkowitych zamiast porównywania ciągów znaków, trzeba dodać do obsady: ((info->>'name')::INT).
jpmc26
13
Jeśli chcesz utworzyć indeks na polu wewnątrz sub-obiektu swojej kolumny JSON, dzięki @DanielRikowski odkryłem, że muszę to zrobić. create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Najpierw musimy użyć, ->aby pobrać obiekt JSON, a następnie ->>uzyskać wartość obiektu podrzędnego jako tekst.
Corey Cole