यह हर अपडेट पर जोंस ऐरे को फिर से बनाकर संभव है।
तालिका निर्माण और उदाहरण डेटा प्रविष्टि के लिए SQL:
CREATE TABLE test_table(
id BIGSERIAL PRIMARY KEY ,
game TEXT,
players JSONB
);
INSERT INTO test_table(game, players)
VALUES
('chess', '[{"name": "Joe", "role": "admin"}, {"name": "Mike", "role": "user"}]'),
('football', '[{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}]');
डाला गया डेटा:
+----+----------+----------------------------------------------------------------------+
| id | game | players |
+----+----------+----------------------------------------------------------------------+
| 1 | chess | [{"name": "Joe", "role": "admin"}, {"name": "Mike", "role": "user"}] |
| 2 | football | [{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}] |
+----+----------+----------------------------------------------------------------------+
क्वेरी अपडेट करें:
WITH json_rows AS
(SELECT id, jsonb_array_elements(players) as json_data FROM test_table
WHERE game = 'chess'),
updated_rows AS (
SELECT
id,
array_to_json(array_agg(
CASE WHEN json_data -> 'name' = '"Joe"'
THEN jsonb_set(json_data, '{role}', '"user"')
ELSE json_data END)) as updated_json
FROM json_rows
GROUP BY id
)
UPDATE test_table SET players = u.updated_json
FROM updated_rows u
WHERE test_table.id = u.id;
क्वेरी के परिणाम:
+----+----------+---------------------------------------------------------------------+
| id | game | players |
+----+----------+---------------------------------------------------------------------+
| 2 | football | [{"name": "Foo", "role": "user"}, {"name": "Bar", "role": "user"}] |
| 1 | chess | [{"name": "Joe", "role": "user"}, {"name": "Mike", "role": "user"}] |
+----+----------+---------------------------------------------------------------------+
क्वेरी निम्न तरीके से काम करती है:
-
json सरणी को json पंक्तियों में बदलें और उन्हें
game
. द्वारा फ़िल्टर करें संपत्ति। यहjson_rows
. बनाकर किया जाता है सीटीई। -
json डेटा को json पंक्तियों में अपडेट करें जहाँ उपयोगकर्ता "Joe" पाया जाता है।
-
एक बार जब आपके पास नए json मान हों, तो बस आईडी के आधार पर एक अपडेट करें।
नोट: जैसा कि आप देख सकते हैं, वर्तमान कार्यान्वयन में जोंस सरणी को फिर से बनाया जाता है (केवल उन पंक्तियों में जिन्हें अद्यतन करने की आवश्यकता है)। यह सरणी के अंदर तत्वों के क्रम में परिवर्तन का कारण हो सकता है।