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ফাংশনগুলির সাথে কাজ করে।