如何在数组索引中创建 Postgresql JSONB 数组?
How do you create a Postgresql JSONB array in array index?
我有这样的结构:user_id, a.
a 是 jsonb 类型,结构如下:
{ b:
[
{ids: [1,2,3,4]},
{ids: [2,3,4]},
{ids: [1,2,4]},
...
]
}
我如何创建一个索引,使我能够找到在 ID 列表中具有特定 ID 的所有用户 (user_id)?
GIN index是你想要的吗?
看来您首先需要将 ID 组织成更易于处理的形式。我对 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);
我有这样的结构:user_id, a.
a 是 jsonb 类型,结构如下:
{ b:
[
{ids: [1,2,3,4]},
{ids: [2,3,4]},
{ids: [1,2,4]},
...
]
}
我如何创建一个索引,使我能够找到在 ID 列表中具有特定 ID 的所有用户 (user_id)?
GIN index是你想要的吗?
看来您首先需要将 ID 组织成更易于处理的形式。我对 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);