यह सामान्यीकृत स्कीमा में अपने मूल्यों को संग्रहीत करने के लिए बहुत अधिक कुशल होगा। उसने कहा, आप इसे अपने वर्तमान सेटअप के साथ भी काम कर सकते हैं।
मान्यताओं
इस तालिका की परिभाषा मानते हुए:
CREATE TABLE tbl (tbl_id int, usr jsonb);
"उपयोगकर्ता" एक आरक्षित शब्द है और इसे कॉलम नाम के रूप में उपयोग करने के लिए दोहरे उद्धरण की आवश्यकता होगी। ऐसा मत करो। मैं usr
इसके बजाय का उपयोग करें ।
सवाल
क्वेरी उतनी तुच्छ नहीं है जितनी (अब हटाई गई) टिप्पणियों से ऐसा लगता है:
SELECT t.tbl_id, obj.val->>'count' AS count
FROM tbl t
JOIN LATERAL jsonb_array_elements(t.usr) obj(val) ON obj.val->>'_id' = '1'
WHERE t.usr @> '[{"_id":"1"}]';
हैं 3 बुनियादी कदम :
1. योग्य पंक्तियों को सस्ते में पहचानें
WHERE t.usr @> '[{"_id":"1"}]'
JSON सरणी में मिलान ऑब्जेक्ट के साथ पंक्तियों की पहचान करता है। अभिव्यक्ति jsonb
स्तंभ पर एक सामान्य GIN सूचकांक का उपयोग कर सकती है , या अधिक विशिष्ट ऑपरेटर वर्ग के साथ jsonb_path_ops
:
CREATE INDEX tbl_usr_gin_idx ON tbl USING gin (usr jsonb_path_ops);
जोड़ा गया WHERE
खंड तार्किक रूप से बेमानी है , लेकिन सूचकांक का उपयोग करना आवश्यक है। ज्वाइन क्लॉज में अभिव्यक्ति समान स्थिति को लागू करती है, लेकिन अब तक क्वालीफाई करने वाली प्रत्येक पंक्ति में सरणी को हटा देने के बाद ही । इंडेक्स सपोर्ट के साथ, पोस्टग्रेज केवल उन पंक्तियों को प्रोसेस करता है जिनमें शुरू करने के लिए एक क्वालिफाइंग ऑब्जेक्ट होता है। छोटी तालिकाओं के साथ ज्यादा फर्क नहीं पड़ता है, बड़ी तालिकाओं और केवल कुछ योग्य पंक्तियों के साथ एक बड़ा अंतर बनाता है ।
सम्बंधित:
2. सरणी में मिलान वस्तु (ओं) को पहचानें
के साथ सबसे असामान्य jsonb_array_elements()
। ( unnest()
केवल पोस्टग्रेज्ड सरणी प्रकारों के लिए अच्छा है।) चूंकि हम केवल वास्तव में मिलान वाली वस्तुओं में रुचि रखते हैं, तुरंत शामिल होने वाली स्थिति में फ़िल्टर करें।
सम्बंधित:
3. नेस्टेड कुंजी के लिए निकालें मूल्य 'count'
योग्यता के बाद वस्तुओं को निकाला गया है, बस obj.val->>'count'
:।
obj(value)
आता है? उस पर हैLATERAL JOIN
,jsonb_array_elements
या कहीं और?