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 mantener datos semiestructurados
en el dialecto PostgreSQL de Spanner. JSONB
conserva los datos
en formato JavaScript Object Notation (JSON), que sigue la especificación
descrita en la RFC 7159.
Especificaciones
El tipo de datos JSONB
de Spanner almacena una representación normalizada de
el documento de entrada. Esto implica lo siguiente:
- Las comillas y los caracteres de espacio en blanco no se conservan.
- No se admiten comentarios. Las transacciones o consultas con comentarios fallan.
- Las claves de objetos se ordenan primero por longitud y, luego, de manera lexicográfica por la longitud de clave de objeto equivalente. Si hay claves de objeto duplicadas, solo las últimas se conserva uno.
- Los tipos primitivos (
string
,boolean
,number
ynull
) tienen su tipo y su valor.- Los valores de tipo
string
se conservan con exactitud. - Los ceros finales se conservan. El formato de salida para los valores de tipo
number
no utiliza la notación científica.
- Los valores de tipo
Los valores
null
deJSONB
se tratan como valores de SQL que no sonNULL
. 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 NULL
Se conserva el orden de los elementos del array JSONB.
Restricciones
Se aplican las siguientes restricciones con JSONB
de Spanner:
- Los argumentos para la función
to_jsonb
solo pueden ser de PostgreSQL. que admite Spanner. - Los valores de tipo de número 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 para el formato de almacenamiento normalizado es de 10 MB.
- Los documentos
JSONB
deben estar codificados en UTF-8. Transacciones o consultas conJSONB
los documentos codificados en otros formatos muestran un error.
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 muestra:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Cómo agregar y quitar columnas JSONB de tablas existentes
Puedes agregar una columna JSONB
y descartarla con sentencias 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.
Este es 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
Bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.
Consulta datos de JSONB
Puedes consultar columnas JSONB
en función de los valores de los campos subyacentes. El
El siguiente ejemplo extrae 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
Bibliotecas cliente de Spanner.
C++
Para obtener información sobre cómo instalar y usar la biblioteca cliente de Spanner, consulta Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 Bibliotecas cliente de Spanner.
Para autenticarte en Spanner, configura las credenciales predeterminadas de la aplicación. Si deseas 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 JSONB
de PostgreSQL no son compatibles con Spanner JSONB
:
- Ordenamiento, comparación y agregación
- PrimaryKey y EXTERNALKey
- Indexación, incluido el índice GIN Para obtener más información, consulta Indexación.
- Modifica una columna
JSONB
hacia o desde cualquier otro tipo de datos - Usar consultas con parámetros y parámetros JSONB sin tipo en herramientas que usan el protocolo de cable de PostgreSQL
Coerción en el motor de consultas. A diferencia de PostgreSQL estándar, la coerción de
JSONB
a texto no es compatible. Solo las cadenasJSON
válidas se convierten al tipoJSONB
para hacer coincidir las firmas de las funciones. Ejemplos:SELECT concat('abc'::text, '{"key1":1}'::jsonb); -- Returns error SELECT concat('abc'::text, CAST('{"key1":1}'::jsonb AS TEXT)); -- This works
Indexación
Las columnas JSONB
no admiten la indexación. Sin embargo, puedes crear un índice en una columna generada para extraer un valor escalar de una columna JSONB
.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
TotalCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) STORED,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);