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 contener datos semiestructurados en el dialecto de PostgreSQL de Spanner. JSONB
contiene datos en formato de notación de objetos JavaScript (JSON), que sigue la especificación que se describe en la 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 fallarán.
- Las claves de objetos se ordenan primero por longitud de clave y, luego, de forma lexicográfica por la longitud de clave de objeto equivalente. Si hay claves de objetos duplicadas, solo se conserva la última.
- Los tipos primitivos (
string
,boolean
,number
ynull
) tienen su tipo y valor preservados.- Los valores de tipo
string
se conservan de forma exacta. - Se conservan los ceros finales. El formato de salida de los valores de tipo
number
no usa notación científica.
- Los valores de tipo
Los valores
null
deJSONB
se tratan como SQL que no esNULL
. 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 Spanner JSONB
:
- Los argumentos de la función
to_jsonb
solo 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
JSONB
deben estar codificados en UTF-8. Las transacciones o consultas con documentosJSONB
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 ejemplo:
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Agrega y quita columnas JSONB de las tablas existentes
Puedes agregar una columna JSONB
y descartarla 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 agregar una columna JSONB
llamada VenueDetails
a la tabla Venues
mediante 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.
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 JSONB
con las 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.
Indexa datos JSON
Puedes acelerar las consultas 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 el índice secundario
Los índices secundarios son útiles cuando se filtran valores escalares dentro de un documento JSONB. Para usar índices secundarios con JSONB, crea una columna generada que extraiga los datos escalares relevantes y los convierta a un tipo de datos 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, creas un índice VenuesByCapacity
que la base de datos usa para encontrar los lugares con capacidades superiores a 1,000. En lugar de verificar cada fila, Spanner usa el índice para ubicar las filas relevantes, lo que mejora el rendimiento de las consultas, en especial para tablas grandes.
ALTER TABLE Venues (
ADD COLUMN VenueCapacity BIGINT GENERATED ALWAYS AS ((VenueFeatures->>'capacity')::BIGINT) VIRTUAL,
DateOpened TIMESTAMPTZ
);
CREATE INDEX VenuesByCapacity ON Venues(TotalCapacity);
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 búsqueda se adapta automáticamente a las variaciones entre los documentos JSON, entre diferentes filas y a lo largo del tiempo.
En el siguiente ejemplo, creas 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 horario de atención. En lugar de verificar cada fila, Spanner usa el índice para ubicar las filas relevantes, lo que mejora el rendimiento de las consultas, en especial para 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 de JSON.
Cómo consultar 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
, donde 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 los datos JSONB
con las 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 de JSONB
de PostgreSQL de código abierto no son compatibles con JSONB
de Spanner:
- Orden, 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 de JSONB que un índice GIN. Para obtener más información, consulta Cómo indexar datos JSON.
- Alterar una columna
JSONB
a cualquier otro tipo de datos o desde cualquier otro tipo de datos - Usa consultas parametrizadas con parámetros JSONB sin tipo en herramientas que usan el protocolo de red de PostgreSQL.
Usar coacción en el motor de consultas A diferencia de PostgreSQL de código abierto, no se admite la coerción implícita de
JSONB
a texto. Debes usar la transmisión explícita del tipoJSONB
para 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