如何在数组索引中创建Postgresql JSONB数组?

时间:2015-01-22 11:08:57

标签: arrays postgresql indexing jsonb postgresql-9.4

我的结构如下:user_id,a。

a的类型为jsonb,具有以下结构:

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

如何创建一个索引,使我能够找到ID列表中具有特定ID的所有用户(user_id)?

1 个答案:

答案 0 :(得分:2)

你想要的是GIN index吗?

您似乎首先需要将ID组织成更易处理的形式。我比使用PostgreSQL操作JSON的方式更熟悉Python,因此我使用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);