En esta página, se describe cómo trabajar con el tipo de datos JSONB cuando usas
Spanner.
JSONB es un tipo de datos de PostgreSQL que se usa para almacenar datos semiestructurados
en el dialecto de PostgreSQL de Spanner. JSONB contiene datos en
formato de notación de objetos de 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 caracteres de espacio en blanco.
- No se admiten comentarios. Las transacciones o consultas con comentarios fallan.
- Las claves de objeto se ordenan primero por su longitud y, luego, de forma lexicográfica 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 valor.- Los valores de tipo
stringse conservan de forma exacta. - Se conservan los ceros finales. El formato de salida para los valores de tipo
numberno usa la notación científica.
- Los valores de tipo
Los valores
nulldeJSONBse 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 del array JSONB.
Restricciones
Se aplican las siguientes restricciones con JSONB de Spanner:
- Los argumentos de la función
to_jsonbsolo pueden ser de los tipos de datos de PostgreSQL que admite Spanner. - Los valores de tipo numérico pueden tener 4,932 dígitos antes del punto decimal y 16,383 dígitos después del punto decimal.
- 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 con documentos deJSONBcodificados en otros formatos devuelven un error.
Comparación y ordenamiento
Puedes comparar los valores JSONB para verificar la igualdad y el orden. También puedes usar
valores JSONB en una cláusula GROUP BY y ORDER BY.
Cuando se comparan valores JSONB de diferentes tipos, se aplican las siguientes relaciones:
Null (JSONB null) < String < Number < Boolean < Array < Object
Cuando se comparan valores de JSONB del mismo tipo, se aplican las siguientes reglas:
- Objetos: Los objetos con más pares clave-valor son mayores que los objetos con menos pares. Si ambos objetos tienen la misma cantidad de pares, sus pares clave-valor se comparan por pares (primero las claves y, luego, los valores) en el orden de claves definido en Especificaciones. El primer par que difiere determina el orden.
- Arrays: Los arrays con más elementos son mayores que los arrays con menos elementos. Si ambos arrays tienen la misma cantidad de elementos, estos se comparan índice por índice de izquierda a derecha. El primer elemento diferente determina el orden del array.
- Booleanos:
truees mayor quefalse. - Números: Se comparan matemáticamente con comparaciones de valores numéricos.
- Cadenas: Se comparan lexicográficamente con las reglas de comparación de cadenas estándar.
Valores nulos de JSONB: Todos los valores
JSONBnullson iguales entre sí y menores que cualquier otro valor JSON no nulo. Sin embargo, se aplica un caso límite:Un array
[]de nivel superior vacío se considera más pequeño que un valor nulo de JSONB. Como esto solo se aplica a los arrays de nivel superior, las siguientes declaraciones devuelven verdadero:'[]'::jsonb < 'null'::jsonb'null'::jsonb < '[[]]'::jsonb'[null]'::jsonb < '[[]]'::jsonb
Crea una tabla con columnas JSONB
Puedes agregar una columna JSONB a una tabla cuando la creas.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
A continuación, se muestra un objeto JSONB VenueFeatures de ejemplo:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Agrega y quita columnas JSONB de tablas existentes
Puedes agregar una columna JSONB y descartarla con las declaraciones 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 agregar una columna JSONB llamada VenueDetails a
la tabla Venues con las bibliotecas cliente de Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifica 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 con
las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C#
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Go
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Indexa datos JSON
Puedes acelerar la consulta de datos JSONB con í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.
Usa un índice secundario
Los índices secundarios son útiles cuando se filtra según valores escalares dentro de un documento JSONB. Para usar índices secundarios con JSONB, crea una columna generada que extraiga los datos escalares pertinentes y los convierta en un tipo de datos de SQL adecuado. Luego, puedes crear un índice secundario en esta columna generada. El índice acelera las consultas aptas que se ejecutan en la columna generada.
En el siguiente ejemplo, crearás un índice VenuesByCapacity que la base de datos usará para encontrar los lugares con capacidades superiores a 1,000. En lugar de
verificar cada fila, Spanner usa el índice para ubicar las filas
pertinentes, lo que mejora el rendimiento de las consultas, en especial para las 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;
Usa índices de búsqueda
Los índices de búsqueda son útiles cuando consultas documentos JSONB que son dinámicos o variados. A diferencia de los índices secundarios, puedes crear índices de búsqueda en cualquier documento JSONB almacenado en una columna JSONB. El índice de la Búsqueda se adapta automáticamente a las variaciones en los documentos JSON, entre diferentes filas y con el tiempo.
En el siguiente ejemplo, crearás un índice de búsqueda VenuesByVenueDetails que
la base de datos usa para encontrar los lugares con detalles específicos, como el tamaño y
el programa de operaciones. En lugar de verificar cada fila, Spanner usa
el índice para ubicar las filas pertinentes, lo que mejora el rendimiento de las consultas,
en especial para las 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;
SELECT VenueName
FROM Venues
WHERE VenueDetails->'open'->'Friday' = 'true'::jsonb
AND VenueDetails->'type' IN ('"stadium"'::jsonb, '"arena"'::jsonb);
Para obtener más información, consulta Índices de búsqueda de JSON.
Consulta datos JSONB
Puedes consultar columnas JSONB según los valores de los campos subyacentes. En el
siguiente ejemplo, se extraen VenueId y VenueName de Venues, en el que
VenueFeatures tiene un valor rating mayor que 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 con
las bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
C#
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Go
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Java
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Node.js
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
PHP
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Python
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Ruby
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta las bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Funciones de JSONB de PostgreSQL no compatibles
Las siguientes funciones de PostgreSQL JSONB de código abierto no son compatibles con
Spanner JSONB:
- 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 de JSONB que un índice GIN. Para obtener más información, consulta Indexa datos JSON.
- Modificar una columna
JSONBhacia o desde cualquier otro tipo de datos - Usa consultas parametrizadas con parámetros JSONB sin tipo en herramientas que usan el protocolo de conexión de PostgreSQL
Usa la coerción en el motor de consultas. A diferencia de PostgreSQL de código abierto, no se admite la coerción implícita de
JSONBa texto. Debes usar la conversión explícita del tipoJSONBpara que coincida con 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