jsonb
পোস্টগ্রিস 9.4+ এ
নতুন বাইনারি JSON ডেটা টাইপের সাথে jsonb
, পোস্টগ্রিস 9.4 মূলত উন্নত সূচক বিকল্পগুলি প্রবর্তন করেছে । আপনার কাছে এখন jsonb
সরাসরি অ্যারেতে একটি জিআইএন সূচক থাকতে পারে :
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
"অপরিবর্তিত" অপারেটর , যা জিআইএন সূচকটি ব্যবহার করতে পারে। ( json
কেবল টাইপের জন্য নয় jsonb
!)
অথবা আপনি jsonb_path_ops
সূচকের জন্য আরও বিশেষায়িত, অ-ডিফল্ট জিআইএন অপারেটর শ্রেণি ব্যবহার করেন:
CREATE INDEX tracks_artists_gin_idx ON tracks
USING gin (artists jsonb_path_ops);
একই প্রশ্ন।
বর্তমানে jsonb_path_ops
কেবল @>
অপারেটরকে সমর্থন করে । তবে এটি সাধারণত অনেক ছোট এবং দ্রুত। আরো সূচক বিকল্প হয় ম্যানুয়াল ইন বিশদ ।
artists
উদাহরণে প্রদর্শিত নাম অনুসারে যদি কেবল নাম ধারণ করে থাকে তবে এটি শুরু করার জন্য কম রিডানড্যান্ট জেএসওএন মান সংরক্ষণ করা আরও দক্ষ হবে: কেবল পাঠ্য আদিম হিসাবে মূল্যবোধ এবং অপ্রয়োজনীয় কী কলামের নাম হতে পারে।
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'));
মন্তব্যে মতামত নিয়ে আপডেট হয়েছে। জিআইএন সূচককে সমর্থন করতে আমাদের অ্যারে অপারেটর ব্যবহার করতে হবে । অপারেটর "দ্বারা অন্তর্ভুক্ত করা হয়" এই ক্ষেত্রে।
<@
ফাংশন অস্থিরতা নোট
তুমি তোমার ফাংশন ডিক্লেয়ার করতে পারেন 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
ফাংশনগুলির সাথে কাজ করে।