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
,number
ynull
) conservan su tipo y su valor.- Los valores de tipo
string
se conservan exactamente. - Los ceros finales se conservan. El formato de salida de los valores de tipo
number
no usa notación científica.
- Los valores de tipo
Los valores
JSONB
null
se tratan como noNULL
de 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 NULL
Se 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_jsonb
solo 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
JSONB
deben estar codificados en UTF-8. Las transacciones o consultas conJSONB
documentos codificados en otros formatos devuelven un error.
Crear una tabla con columnas JSONB
Puedes añadir una JSONB
columna 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
JSONB
a 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
JSONB
a texto. Debes usar la conversión explícita del tipoJSONB
para 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