আপনার মানগুলি একটি সাধারণীকৃত স্কিমাতে সঞ্চয় করা আরও বেশি দক্ষ হবে। এটি বলেছিল, আপনি এটি আপনার বর্তমান সেটআপ দিয়ে কাজ করতে পারেন।
অনুমিতি
এই সারণির সংজ্ঞাটি ধরে নেওয়া:
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"}]'জেএসওন অ্যারেতে মিল থাকা বস্তুর সাথে সারিগুলি সনাক্ত করে। অভিব্যক্তিটি jsonbকলামে জেনেরিক জিআইএন সূচক বা আরও বিশেষায়িত অপারেটর শ্রেণীর একটি ব্যবহার করতে পারে jsonb_path_ops:
CREATE INDEX tbl_usr_gin_idx ON tbl USING gin (usr jsonb_path_ops);
যুক্ত WHEREধারাটি যুক্তিযুক্তভাবে অপ্রয়োজনীয় , তবে এটি সূচক ব্যবহার করা প্রয়োজন। যোগদানের শর্তে অভিব্যক্তি একই শর্তটি প্রয়োগ করে তবে এখন পর্যন্ত প্রতিটি সারিতে অ্যারে অননেস্ট করার পরে । সূচী সমর্থন সহ, পোস্টগ্রিস কেবল সারিগুলি প্রক্রিয়া করে যা শুরু করতে কোনও যোগ্যতাযুক্ত বস্তু থাকে। ছোট টেবিলগুলির সাথে খুব বেশি কিছু আসে যায় না, বড় টেবিলগুলির সাথে একটি বিশাল পার্থক্য করে এবং কেবলমাত্র কয়েকটি যোগ্যতার সারি।
সম্পর্কিত:
2. অ্যারে ম্যাচিং অবজেক্ট (গুলি) সনাক্ত করুন
সাথে অযথা jsonb_array_elements()। ( unnest()পোস্টগ্র্রেস অ্যারে ধরণের ক্ষেত্রে কেবল ভাল)
সম্পর্কিত:
৩. নেস্টেড কীটির জন্য মান বের করুন 'count'
পরে কোয়ালিফাইং বস্তু নিষ্কাশিত করা হয়েছে, কেবল: obj.val->>'count'।
obj(value)থেকে আসে? এটি কিLATERAL JOIN,jsonb_array_elementsঅন্য কোথাও?