एक GIN अनुक्रमणिका है आप क्या चाहते हैं?
ऐसा लगता है कि आपको सबसे पहले आईडी को एक ऐसे रूप में व्यवस्थित करने की आवश्यकता है जो अधिक ट्रैक्टेबल हो। मैं अजगर से अधिक परिचित हूं, क्योंकि मैं JSON में हेरफेर करने के PostgreSQL तरीकों से हूं, इसलिए मैंने इस उद्देश्य के लिए 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);