Bueno, JSONB en PostgreSQL es una herramienta super potente para guardar estructuras de datos jerárquicas y complejas. Pero, ¿qué pasa si necesitas actualizar un valor dentro de una columna JSONB? Por ejemplo, cambiar el número de teléfono de un usuario o añadir una nueva categoría a un array. Suena fácil, pero JSONB no es una tabla donde puedas cambiar el valor de una celda directamente. Para actualizar datos en un objeto JSON vamos a usar funciones especiales. Hoy los protagonistas son:
jsonb_set(): para cambiar o añadir un valor en una "ruta" específica.jsonb_insert(): para insertar un nuevo elemento en un array JSON.
Actualizando datos con jsonb_set()
La función jsonb_set() te permite modificar una parte de un objeto JSONB o añadirle nuevas claves y valores.
Sintaxis general
jsonb_set(target jsonb, path text[], new_value jsonb, create_missing boolean)
target— nuestro objeto JSONB que queremos actualizar.path— array de strings que representa la ruta a la clave que quieres cambiar.new_value— el valor que quieres añadir o reemplazar.create_missing— parámetro booleano (TRUE o FALSE) que indica si se deben crear las claves que faltan.
Vamos a ver un ejemplo sencillo. Imagina que tienes una tabla users con una columna profile de tipo JSONB, donde se guardan los perfiles de los usuarios. Uno de los usuarios quiere actualizar su número de teléfono. ¿Cómo lo hacemos?
-- Creamos la tabla y añadimos datos
CREATE TABLE users (
id SERIAL PRIMARY KEY,
profile JSONB
);
INSERT INTO users (profile)
VALUES ('{"name": "Otto", "contact": {"phone": "+1-495-123-45-67"}}');
-- Actualizamos el número de teléfono
UPDATE users
SET profile = jsonb_set(profile, '{contact,phone}', '"8-800-555-35-35"', FALSE)
WHERE id = 1;
-- Comprobamos el resultado
SELECT profile FROM users WHERE id = 1;
Resultado:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
}
}
¡Guau! ¡Hemos cambiado el número de teléfono! Fíjate que la ruta a la clave se indica como un array de strings '{contact,phone}'.
Añadiendo una nueva clave
Si la clave que quieres actualizar no existe, puedes usar el parámetro create_missing = TRUE para crearla:
UPDATE users
SET profile = jsonb_set(profile, '{address,city}', '"Berlín"', TRUE)
WHERE id = 1;
-- Comprobamos el resultado
SELECT profile FROM users WHERE id = 1;
Resultado:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlín"
}
}
Ahora tenemos una nueva sección con la dirección. Cómodo, ¿verdad?
Insertando datos con jsonb_insert()
La función jsonb_insert() se usa para añadir elementos a arrays dentro de objetos JSONB.
Sintaxis general
jsonb_insert(target jsonb, path text[], new_value jsonb, insert_after boolean)
target— el objeto JSONB de destino.path— array de strings que representa la ruta al array donde quieres insertar elementos.new_value— el valor que quieres añadir.insert_after— parámetro booleano. Si es FALSE, el elemento se inserta antes del índice indicado; si es TRUE, después.
Vamos con un ejemplo. Supón que tienes una tabla donde en la columna profile se guarda una lista de intereses del usuario. Queremos añadir un nuevo interés al array:
-- Añadimos datos para el ejemplo
UPDATE users
SET profile = jsonb_set(profile, '{interests}', '["deporte", "música"]', TRUE)
WHERE id = 1;
-- Insertamos el nuevo interés "programación" al principio de la lista
UPDATE users
SET profile = jsonb_insert(profile, '{interests,0}', '"programación"', FALSE)
WHERE id = 1;
-- Comprobamos el resultado
SELECT profile FROM users WHERE id = 1;
Resultado:
{
"name": "Otto",
"contact": {
"phone": "8-800-555-35-35"
},
"address": {
"city": "Berlín"
},
"interests": [
"programación",
"deporte",
"música"
]
}
Problemas comunes y cómo evitarlos
Trabajar con jsonb_set() y jsonb_insert() puede ser un poco tricky si no tienes en cuenta lo siguiente:
- Ruta incorrecta a la clave. Si pones una ruta incorrecta o intentas actualizar un elemento que no existe sin
create_missing=TRUE, tendrás un error o no cambiarás nada. Revisa siempre la estructura de tu JSON. - Tipos de datos incompatibles. Recuerda que
new_valuedebe ser de tipo JSONB. Si quieres insertar un string, ponlo entre comillas dobles ('"valor"'). - Sobrescribir datos. Si intentas actualizar un array sin usar las funciones adecuadas, puedes borrar datos antiguos sin querer. Usa
jsonb_insert()para añadir nuevos elementos de forma segura.
Ejemplo de error:
-- Error: ruta incorrecta
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nuevo contacto"', FALSE)
WHERE id = 1;
Esto dará error porque en el objeto profile no hay una clave contacts y create_missing está en FALSE.
Cómo evitarlo:
-- Ponemos create_missing = TRUE
UPDATE users
SET profile = jsonb_set(profile, '{contacts}', '"nuevo contacto"', TRUE)
WHERE id = 1;
¿Dónde se usa esto en la vida real?
Trabajar con JSONB no es solo por diversión, es una habilidad clave para un montón de apps modernas. Aquí tienes algunos ejemplos reales:
- Guardar configuraciones de usuario. JSONB es perfecto para estructuras de datos dinámicas, como settings de apps que pueden ser diferentes para cada usuario.
- Integración con APIs externas. JSONB va genial para guardar datos en bruto de REST APIs que devuelven objetos JSON.
- Análisis de big data. Las estructuras anidadas de JSON permiten trabajar con datos de IoT, logs o analítica.
Y hasta aquí nuestro paseo introductorio por la actualización de objetos JSON. Ahora ya sabes cómo insertar, actualizar y añadir datos en JSONB, y también cómo evitar los errores más típicos. ¡En la próxima lección verás cómo combinar objetos JSONB y trabajar con ellos aún más eficientemente!
GO TO FULL VERSION