Kuidas värskendada JSONB massiivides olevaid objekte PostgreSQL-iga

JSONB massiivi konkreetse väärtuse värskendamine

Oletame, et otsustasite salvestada andmed andmebaasi json või jsonb kujul ja avastasite, et lõite lihtsalt enda jaoks uusi probleeme, mida teil varem polnud. Sa ei ole üksi.

JSONB on võimas tööriist, kuid selle eest tuleb maksta mõningaid kulusid, sest peate kohandama viisi, kuidas päringuid teostate ja andmetega ümber käima.

Ja see pole haruldane, kui laadite kogu jsonbi objekti mällu, teisendate selle eelistatud programmeerimiskeele abil ja salvestate seejärel tagasi andmebaasi. Kuid lõite just teise probleemi: jõudluse kitsaskohad ja ressursside raiskamine.

Selles artiklis vaatame, kuidas massiivi objekti konkreetset väärtust ühe päringuga värskendada.

TL; DR : viimane päring on artikli lõpus ja saate otsida näite DB Fiddle'ist, et kopeerida, kleepida ja mängida.

Oletame, et rakendate kliendiekraani, et salvestada iga kliendi jaoks dünaamilised kontaktid. Siis pakute välja idee salvestada kontaktid JSONB-veeruna, kuna need on dünaamilised ja seega on mõttetu kasutada mitte-relatsioonilist andmestruktuuri.

Seejärel loote JSONB-kontaktide veeruga klienditabeli ja lisate sinna mõned andmed:

Päris lihtne eks? Kuid kuidas saate konkreetse kontakti konkreetsele kliendile värskendada? Kuidas muuta Jimi e-posti või Janise telefoni? ?

Õnneks on PostgreSQL teie sõber ja pakub funktsiooni jsonb_set :

jsonb_set (sihtmärk jsonb, teetekst [], uus_väärtus jsonb [, loo_väljakuulutus])

Võttes veeru jsonb, saate määratud teele määrata uue väärtuse:

Ülaltoodud valikud tagastavad:

[{“type”: “phone”, “value”: “+1–202–555–0105”}, {“type”: “email”, “value”: “[email protected]”}] [{“type”: “email”, “value”: “[email protected]”}]

Jimi e-posti aadressi muutmiseks kontaktide loendis teatate tee " 1, väärtus", mis tähendab massiivi teist objekti (algusega 0) ja võtme väärtust . See on tee . Sama kehtib Janise e-posti aadressi muutmise kohta, kuid selle e-posti objekt asub indeksis 0.

Võib-olla mõtlete: ma pean värskenduse avalduses lihtsalt kasutama jsonb_set ja see kõik on tehtud? See on idee, kuid sellest pole veel piisavalt.

Mitte-relatsiooniliste andmete probleem on see, et need on dünaamilised. Noh, see on üks JSONB-i kasutamise põhjusi, kuid see toob kaasa probleemi: vaadake, et Jimi e-posti objekt asub massiivi indeksis 1 ja Janise e-posti objekt massiivi indeksis 0 ja teisel kliendil võib olla väga erinev massiiv, millel on erinevad indeksid . Niisiis, kuidas saate leida iga kontakti tüübi indeksi? ?

Vastus on massiivi elementide järjestamine ja selle indeksi hankimine:

See päring tagastab 1 , mis on indeksi kohta e objekti (tüüp e) sees kontaktid massiivi kliendi Jimi.

Nüüd on meil kõik nuputamise osad: me teame, kuidas värskendada jsonbi väärtust ja kuidas avastada värskendatava objekti register.

Ainus samm on jäänud värskendus ise. Selle kõik kokku pannes on meil:

Selle päringu kõige olulisem osa on with block. See on võimas ressurss, kuid selle näite jaoks võite seda mõelda kui "muutuja salvestamise viisi", mis on värskendatava kontakti tee , mis on dünaamiline sõltuvalt kirjest.

Lubage mul selle osa kohta veidi selgitada:

(‘’)::text[] as path

See lihtsalt ehitab tee nimega „{1, value}” , kuid me peame teisendama tekstiks [], kuna seda tüüpi eeldatakse funktsioonilt jsonb_path .

Pakkimine

JSONB on suurepärane ja väärtuslik tööriist paljude probleemide lahendamiseks. Kuid pidage meeles, et peate ka selliseid andmeid päringuid tegema ja värskendama. See toob kaasa kulu, mida peate arvestama, kui otsustate, milliseid tööriistu valida.

Kõrvalmärkus: see lahendus tuli paarilisest programmeerimisseansist koos Lucas Cegattiga.

Kas otsite oma järgmise idee elluviimiseks loomeettevõtet? Tutvuge LNA Systemsiga ja räägime.