¿Cómo crear un índice en el campo JSON en Postgres?

111

En PostgreSQL 9.3 Beta 2 (?), ¿Cómo creo un índice en un campo JSON? Lo probé usando el ->operador utilizado para hstorepero obtuve el siguiente error:

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

ERROR: el tipo de datos json no tiene una clase de operador predeterminada para el método de acceso "btree" SUGERENCIA: Debe especificar una clase de operador para el índice o definir una clase de operador predeterminada para el tipo de datos.

rlib
fuente
8
"¿Dónde está la pregunta?" - EN el título
rlib
2
En el futuro, eche un vistazo a stackoverflow.com/tags/postgresql/info , la sección "hacer mejores preguntas"; podría ayudar a obtener mejores respuestas antes con menos preguntas molestas.
Craig Ringer

Respuestas:

186

Encontró:

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

Como se indica en los comentarios, la sutil diferencia aquí es en ->>lugar de ->. El primero devuelve el valor como texto, el segundo como un objeto JSON.

rlib
fuente
39
En caso de que esté buscando la diferencia: es en ->>lugar de ->. El primero devuelve el valor como texto, el último devuelve un objeto JSON.
Daniel Rikowski
35
Los dobles paréntesis también son importantes.
Ron
11
@Jac_opo Los extrae comoTEXT , sin embargo. Si usted quiere hacer comparaciones enteros en lugar de comparaciones de cadenas, hay que añadir un reparto: ((info->>'name')::INT).
jpmc26
13
Si desea crear un índice en un campo dentro de un subobjeto de su columna JSON, gracias a @DanielRikowski descubrí que tenía que hacerlo create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Primero debemos usarlo ->para obtener el objeto JSON y luego ->>para obtener el valor del objeto secundario como texto.
Corey Cole