En esta página se describe cómo trabajar con el tipo de datos JSONB al usar Spanner.
JSONB es un tipo de datos de PostgreSQL que se usa para almacenar datos semiestructurados en el dialecto PostgreSQL de Spanner. JSONB contiene datos en formato de notación de objetos JavaScript (JSON), que sigue la especificación descrita en RFC 7159.
Especificaciones
El tipo de datos JSONB de Spanner almacena una representación normalizada del documento de entrada. Esto implica lo siguiente:
- No se conservan las comillas ni los espacios.
- No se admiten comentarios. Las transacciones o las consultas con comentarios fallan.
- Las claves de objeto se ordenan primero por la longitud de la clave y, después, lexicográficamente por la longitud de la clave de objeto equivalente. Si hay claves de objeto duplicadas, solo se conserva la última.
- Los tipos primitivos (
string,boolean,numberynull) conservan su tipo y su valor.- Los valores de tipo
stringse conservan exactamente. - Los ceros finales se conservan. El formato de salida de los valores de tipo
numberno usa notación científica.
- Los valores de tipo
Los valores
JSONBnullse tratan como noNULLde SQL. Por ejemplo:SELECT null::jsonb IS NULL; -- Returns true SELECT 'null'::jsonb IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'a' IS NULL; -- Returns false SELECT '{"a":null}'::jsonb -> 'b' IS NULL; -- Returns true SELECT '{"a":null}'::jsonb -> 'a'; -- Returns a JSONB 'null' SELECT '{"a":null}'::jsonb -> 'b'; -- Returns a SQL NULLSe conserva el orden de los elementos de la matriz JSONB.
Restricciones
Se aplican las siguientes restricciones con Spanner JSONB:
- Los argumentos de la función
to_jsonbsolo pueden ser de los tipos de datos de PostgreSQL que admite Spanner. - Los valores de tipo Number pueden tener 4932 dígitos antes del punto decimal y 16.383 después.
- El tamaño máximo permitido del formato de almacenamiento normalizado es de 10 MB.
- Los documentos
JSONBdeben estar codificados en UTF-8. Las transacciones o consultas conJSONBdocumentos codificados en otros formatos devuelven un error.
Crear una tabla con columnas JSONB
Puedes añadir una JSONBcolumna a una tabla cuando la crees.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
A continuación, se muestra un objeto VenueFeatures JSONB de ejemplo:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Añadir y quitar columnas JSONB de tablas
Puede añadir una columna JSONB y eliminarla con instrucciones ALTER de la siguiente manera:
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
En el siguiente ejemplo se muestra cómo añadir una columna JSONB llamada VenueDetails a la tabla Venues mediante las bibliotecas de cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modificar datos JSONB
Puedes modificar una columna JSONB como cualquier otra columna.
A continuación, se muestra un ejemplo:
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
En el siguiente ejemplo se muestra cómo actualizar los datos de JSONB mediante las bibliotecas de cliente de Spanner.
C++
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Indexar datos JSON
Puedes acelerar las consultas de datos JSONB mediante índices secundarios y índices de búsqueda con tus datos JSONB. Spanner no admite el uso de columnas de tipo JSONB como claves en índices secundarios.
Usar índice secundario
Los índices secundarios son útiles cuando se filtran valores escalares en un documento JSONB. Para usar índices secundarios con JSONB, crea una columna generada que extraiga los datos escalares relevantes y los convierta al tipo de datos SQL adecuado. Después, puedes crear un índice secundario en esta columna generada. El índice acelera las consultas aptas que se ejecutan en la columna generada.
En el ejemplo siguiente, se crea un índice VenuesByCapacity que la base de datos usa para buscar los locales con una capacidad superior a 1000. En lugar de comprobar cada fila, Spanner usa el índice para localizar las filas pertinentes, lo que mejora el rendimiento de las consultas, especialmente en tablas grandes.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Usar índices de búsqueda
Los índices de búsqueda son útiles cuando se hacen consultas en documentos JSONB dinámicos o variados. A diferencia de los índices secundarios, puede crear índices de búsqueda en cualquier documento JSONB almacenado en una columna JSONB. El índice de búsqueda se adapta automáticamente a las variaciones de los documentos JSON, entre las distintas filas y a lo largo del tiempo.
En el siguiente ejemplo, se crea un VenuesByVenueDetails índice de búsqueda que la base de datos usa para encontrar los locales con detalles específicos, como el tamaño y el horario de apertura. En lugar de comprobar cada fila, Spanner usa el índice para localizar las filas relevantes, lo que mejora el rendimiento de las consultas, especialmente en tablas grandes.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens spanner.tokenlist
GENERATED ALWAYS AS (spanner.tokenize_jsonb(VenueDetails)) VIRTUAL HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venues (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE VenueDetails @> '{"labels": ["large"], "open": {"Friday": true}}'::jsonb;
Para obtener más información, consulta Índices de búsqueda JSON.
Consultar datos JSONB
Puede consultar las columnas JSONB en función de los valores de los campos subyacentes. En el siguiente ejemplo se extraen VenueId y VenueName de Venues donde VenueFeatures tiene un valor de rating superior a 3.5.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
En el siguiente ejemplo se muestra cómo consultar datos de JSONB mediante bibliotecas de cliente de Spanner.
C++
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
C#
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Go
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Java
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Node.js
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
PHP
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Python
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Ruby
Para saber cómo instalar y usar la biblioteca de cliente de Spanner, consulta Bibliotecas de cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo local.
Funciones JSONB de PostgreSQL no admitidas
Las siguientes funciones de PostgreSQL JSONB de código abierto no se admiten en Spanner JSONB:
- Ordenación, comparación y agregación
- PrimaryKey y ForeignKey
- Indexación, incluido el índice GIN. En su lugar, puedes usar un índice de búsqueda de Spanner, que acelera las mismas operaciones JSONB que un índice GIN. Para obtener más información, consulta Indexar datos JSON.
- Cambiar una columna
JSONBa cualquier otro tipo de datos o viceversa - Usar consultas con parámetros con parámetros JSONB sin tipo en herramientas que usan el protocolo de conexión de PostgreSQL
Usar la coerción en el motor de consultas. A diferencia de PostgreSQL de código abierto, no se admite la conversión implícita de
JSONBa texto. Debes usar la conversión explícita del tipoJSONBpara que coincidan las firmas de las funciones. Por ejemplo:SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works SELECT 3 + CAST('5'::jsonb AS INTEGER); -- This works