2015-01-22 2 views
2

У меня есть структура вроде этого: user_id, a.Как создать массив Postgresql JSONB в индексе массива?

А типа jsonb и имеет следующую структуру:

{ b: 
    [ 
    {ids: [1,2,3,4]}, 
    {ids: [2,3,4]}, 
    {ids: [1,2,4]}, 
    ... 
    ] 
} 

Как бы сделать индекс, который позволил мне найти всех пользователей (user_id), который имеет определенный идентификатор в списке IdS?

ответ

2

Является GIN index, что вы хотите?

Кажется, что вам сначала нужно организовать идентификаторы в форме, которая более удобна. Я больше знаком с Python, чем с методами PostgreSQL для управления JSON, поэтому для этой цели я использовал PL/Python.

DROP TABLE IF EXISTS ids; 

CREATE TABLE ids (user_id integer, a jsonb); 

INSERT INTO ids VALUES 
    (1, '{"b": [{"ids": [1, 2, 3, 4]}, {"ids": [2, 3, 4]}, {"ids": [1, 2, 4]}]}'), 
    (2, '{"b": [{"ids": [2, 3, 4]}]}'), 
    (3, '{"b": [{"ids": [4, 5, 6]}, {"ids": [6, 7, 8]}]}'); 

CREATE OR REPLACE FUNCTION extract_ids(a_json jsonb) 
RETURNS int[] AS 
$BODY$ 
    import json 
    s = set() 
    a = json.loads(a_json) 
    for key in a.keys(): 
     for id_set in a[key]: 
      s.update(id_set['ids']) 
    return(list(s)) 
$BODY$ LANGUAGE plpythonu IMMUTABLE; 

SELECT user_id, extract_ids(a) 
FROM ids; 

CREATE INDEX ON ids USING gin (extract_ids(a)); 

SELECT user_id 
FROM ids 
WHERE ARRAY[3] <@ extract_ids(a); 
Смежные вопросы