Deməli, PostgreSQL-də JSONB — mürəkkəb və iyerarxik məlumat strukturlarını saxlamaq üçün güclü bir alətdir. Bəs, əgər sənə JSONB sütununda hansısa dəyəri dəyişmək lazımdırsa? Məsələn, istifadəçinin telefon nömrəsini dəyişmək və ya array-a yeni bir kateqoriya əlavə etmək istəyirsən? Asan səslənir, amma JSONB elə bir şey deyil ki, birbaşa bir hüceyrədəki dəyəri dəyişəsən. JSON obyektində məlumatı yeniləmək üçün xüsusi funksiyalardan istifadə edəcəyik. Bu gün əsas qəhrəmanlarımız bunlardır:
jsonb_set(): göstərilən "yol" üzrə dəyəri dəyişmək və ya əlavə etmək üçün.jsonb_insert(): JSON array-ına yeni element əlavə etmək üçün.
jsonb_set() ilə məlumatların yenilənməsi
jsonb_set() funksiyası JSONB obyektinin bir hissəsini dəyişməyə və ya ora yeni açar və dəyərlər əlavə etməyə imkan verir.
Ümumi sintaksis
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
target— yeniləmək istədiyimiz JSONB obyektimiz.path— dəyişmək istədiyimiz açara gedən yolun string array-i.new_value— əlavə etmək və ya əvəzləmək istədiyimiz dəyər.create_missing— boolean parametr (TRUE və ya FALSE), əgər açar yoxdursa, onu yaratmaq lazımdırmı?
Gəlin ən sadə nümunəyə baxaq. Tutaq ki, users adlı bir cədvəlimiz var və profile adlı JSONB tipli sütunda istifadəçi profilləri saxlanılır. İstifadəçilərdən biri telefon nömrəsini dəyişir. Bunu necə edəcəyik?
-- Cədvəl yaradırıq və məlumat əlavə edirik
CREATE TABLE users (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');
-- Telefon nömrəsini yeniləyirik
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;
-- Nəticəyə baxırıq
SELECT profile FROM users WHERE id = 1;
Nəticə:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
}
}
Vau! Telefon nömrəsini dəyişdik! Fikir ver, açara gedən yol string array kimi '{contact,phone}' göstərilir.
Yeni açar əlavə etmək
Əgər dəyişmək istədiyin açar mövcud deyilsə, create_missing = TRUE parametrindən istifadə edib onu yarada bilərsən:
UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlin"', TRUE)
WHERE id = 1;
-- Nəticəyə baxırıq
SELECT profile FROM users WHERE id = 1;
Nəticə:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
}
}
İndi artıq ünvan bölməsi də var. Rahatdır, düzdür?
jsonb_insert() ilə məlumat əlavə etmək
jsonb_insert() funksiyası JSONB obyektlərinin içindəki array-lara element əlavə etmək üçündür.
Ümumi sintaksis
jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
target— hədəf JSONB obyekti.path— element əlavə etmək istədiyin array-a gedən yolun string array-i.new_value— əlavə etmək istədiyin dəyər.insert_after— boolean parametr. Əgər FALSE-dursa, element göstərilən indeksdən əvvəl əlavə olunur; TRUE-dursa, sonra.
Nümunə göstərək. Tutaq ki, cədvəldə profile sütununda istifadəçinin maraqları saxlanılır. Array-a yeni maraq əlavə etmək istəyirik:
-- Nümunə üçün məlumat əlavə edirik
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["sport", "musigi"]', TRUE)
WHERE id = 1;
-- "proqramlashdirma" marağını siyahının əvvəlinə əlavə edirik
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"proqramlashdirma"', FALSE)
WHERE id = 1;
-- Nəticəyə baxırıq
SELECT profile FROM users WHERE id = 1;
Nəticə:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlin"
},
"interests": [
"proqramlashdirma",
"sport",
"musigi"
]
}
Tez-tez rast gəlinən problemlər və onlardan necə qaçmaq olar
jsonb_set() və jsonb_insert() ilə işləyəndə bəzi məqamları nəzərə almasan, iş bir az çətin ola bilər:
- Açar üçün səhv yol. Əgər yolu səhv göstərsən və ya mövcud olmayan elementi
create_missing=TRUEolmadan dəyişmək istəsən, ya səhv alacaqsan, ya da heç nə dəyişməyəcək. Həmişə JSON strukturunu yoxla. - Data type uyğun gəlmir. Yadda saxla ki,
new_valueJSONB tipində olmalıdır. String əlavə etmək istəyirsənsə, mütləq iki dırnaq işarəsi ilə ('"deyer"') yaz. - Məlumatların üstündən yazmaq. Array-ı düzgün funksiya ilə yeniləməsən, köhnə məlumatları itirə bilərsən. Yeni element əlavə etmək üçün
jsonb_insert()istifadə et.
Səhv nümunəsi:
-- Səhv: yol düzgün deyil
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"yeni kontakt"', FALSE)
WHERE id = 1;
Bu, səhv verəcək, çünki profile obyektində contacts açarı yoxdur və create_missing FALSE-dur.
Necə düzəltmək olar:
-- create_missing = TRUE göstəririk
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"yeni kontakt"', TRUE)
WHERE id = 1;
Bunlar real həyatda harada istifadə olunur?
JSONB ilə işləmək sadəcə əyləncə deyil, bir çox müasir tətbiqlər üçün vacib skill-dir. Budur, real nümunələr:
- İstifadəçi ayarlarının saxlanması. JSONB dinamik məlumat strukturları üçün idealdır, məsələn, hər istifadəçidə fərqli ola bilən app ayarları.
- Xarici API-lərlə inteqrasiya. JSONB REST API-lərdən gələn xam JSON obyektlərini saxlamaq üçün çox rahatdır.
- Big data analizi. Nested JSON strukturları IoT məlumatları, loglar və ya analitika üçün əladır.
Beləliklə, JSON obyektlərinin yenilənməsi üzrə giriş dərsimiz bitdi. Artıq bilirsən ki, JSONB-də necə insert, update və əlavə etmək, həmçinin tipik səhvlərdən necə qaçmaq olar. Növbəti dərsdə JSONB obyektlərini birləşdirməyi və onlarla daha effektiv işləməyi öyrənəcəksən!
GO TO FULL VERSION