jsonb
Postgres में 9.4+
नए बाइनरी JSON डेटा प्रकार के साथ jsonb
, Postgres 9.4 ने काफी हद तक बेहतर सूचकांक विकल्प पेश किए । अब आप एक jsonb
सरणी पर सीधे GIN सूचकांक रख सकते हैं :
CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
सरणी को परिवर्तित करने के लिए फ़ंक्शन की आवश्यकता नहीं है। यह एक प्रश्न का समर्थन करेगा:
SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
@>
नया jsonb
"ऑपरेटर" होता है , जो GIN इंडेक्स का उपयोग कर सकता है। (प्रकार के लिए नहीं json
, केवल jsonb
!)
या आप jsonb_path_ops
सूचकांक के लिए अधिक विशिष्ट, गैर-डिफ़ॉल्ट GIN ऑपरेटर वर्ग का उपयोग करते हैं:
CREATE INDEX tracks_artists_gin_idx ON tracks
USING gin (artists jsonb_path_ops);
समान क्वेरी।
वर्तमान में jsonb_path_ops
केवल @>
ऑपरेटर का समर्थन करता है । लेकिन यह आमतौर पर बहुत छोटा और तेज होता है। अधिक इंडेक्स विकल्प हैं, मैनुअल में विवरण ।
तो artists
बस के रूप में दिखाया गया है उदाहरण के केवल नाम रखती है, इसे और अधिक एक कम अनावश्यक JSON मूल्य के साथ शुरू करने के लिए स्टोर करने के लिए कुशल होगा मान पाठ के रूप में पुरातन और अनावश्यक कुंजी स्तंभ नाम में हो सकता है।
JSON वस्तुओं और आदिम प्रकारों के बीच अंतर पर ध्यान दें:
CREATE TABLE tracks (id serial, artistnames jsonb);
INSERT INTO tracks VALUES (2, '["The Dirty Heads", "Louis Richards"]');
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);
प्रश्न:
SELECT * FROM tracks WHERE artistnames ? 'The Dirty Heads';
?
ऑब्जेक्ट वैल्यू के लिए काम नहीं करता है , बस चाबियाँ और सरणी तत्व ।
या (अधिक कुशल अगर नाम अक्सर दोहराया जाता है):
CREATE INDEX tracks_artistnames_gin_idx ON tracks
USING gin (artistnames jsonb_path_ops);
प्रश्न:
SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"'::jsonb;
json
पोस्टग्रेट्स 9.3+ में
यह एक IMMUTABLE
समारोह के साथ काम करना चाहिए :
CREATE OR REPLACE FUNCTION json2arr(_j json, _key text)
RETURNS text[] LANGUAGE sql IMMUTABLE AS
'SELECT ARRAY(SELECT elem->>_key FROM json_array_elements(_j) elem)';
यह कार्यात्मक सूचकांक बनाएं :
CREATE INDEX tracks_artists_gin_idx ON tracks
USING gin (json2arr(artists, 'name'));
और इस तरह एक क्वेरी का उपयोग करें। WHERE
खंड में अभिव्यक्ति को सूचकांक में एक से मेल खाना है:
SELECT * FROM tracks
WHERE '{"The Dirty Heads"}'::text[] <@ (json2arr(artists, 'name'));
टिप्पणियों में प्रतिक्रिया के साथ अपडेट किया गया। GIN इंडेक्स को सपोर्ट करने के लिए हमें ऐरे ऑपरेटर्स का उपयोग करना होगा। ऑपरेटर "के अंतर्गत होता है" इस मामले में।
<@
फ़ंक्शन अस्थिरता पर नोट्स
यदि आप नहींIMMUTABLE
भी हैं तो भी आप अपने कार्य की घोषणा कर सकते हैं।
अधिकांश कार्य केवल हुआ करते थे , नहीं । इसे बदलने के लिए हैकर्स की सूची पर चर्चा हुई। अब ज्यादातर हैं । इससे जाँच करें:json_array_elements()
JSON
STABLE
IMMUTABLE
IMMUTABLE
SELECT p.proname, p.provolatile
FROM pg_proc p
JOIN pg_namespace n ON n.oid = p.pronamespace
WHERE n.nspname = 'pg_catalog'
AND p.proname ~~* '%json%';
कार्यात्मक सूचकांक केवल कार्यों के साथ काम करते IMMUTABLE
हैं।