En esta página, se describe cómo trabajar con JSON usando Spanner.
El tipo de datos JSON es un tipo de datos semiestructurado que se usa para conservar datos JSON (notación de objetos de JavaScript). Las especificaciones del formato JSON se describen en RFC 7159.
JSON es útil para complementar un esquema relacional para datos dispersos, que tienen una estructura definida o que cambia de manera flexible. Sin embargo, el optimizador de consultas se basa en el modelo relacional para filtrar, unir, agregar y ordenar a gran escala de manera eficiente. Las consultas sobre JSON tendrán menos optimizaciones integradas y menos posibilidades de inspeccionar y ajustar el rendimiento.
Especificaciones
El tipo JSON de Spanner almacena una representación normalizada del documento JSON de entrada.
- JSON se puede anidar hasta un máximo de 80 niveles.
- El espacio en blanco no se conserva.
- No se admiten comentarios. Las transacciones o consultas con comentarios fallarán.
- Los miembros de un objeto JSON se ordenan de manera lexicográfica.
- Los elementos del arreglo JSON se conservan en su orden.
- Si un objeto JSON tiene claves duplicadas, solo se conserva la primera.
- Los tipos básicos (string, booleano, número y nulo) tienen su tipo y valor preservados.
- Los valores de tipo de string se conservan de forma exacta.
- Los valores de tipo numérico se conservan, pero su representación textual puede cambiar como resultado del proceso de normalización. Por ejemplo, un número de entrada de 10,000 puede tener una representación normalizada de 1e+4. La semántica de preservación del valor numérico es la siguiente:
- Se conservan los números enteros con signo en el rango de [INT64_MIN, INT64_MAX].
- Se conservan los números enteros sin signo en el rango de [0, UINT64_MAX].
- Se conservan los valores dobles que se pueden convertir de cadena a doble y a cadena sin pérdida de precisión decimal. Si un valor doble
no puede realizar un viaje de ida y vuelta de esta manera, la transacción o la consulta fallarán.
- Por ejemplo,
SELECT JSON '2.2412421353246235436'falla. - Una solución alternativa funcional es
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round'), que muestraJSON '2.2412421353246237'.
- Por ejemplo,
- Usa las funciones
TO_JSON(),JSON_OBJECT()yJSON_ARRAY()para construir documentos JSON en SQL. Estas funciones implementan los caracteres de escape y entrecomillado necesarios.
El tamaño máximo permitido del documento normalizado es de 10 MB.
Nulabilidad
Los valores null de JSON se tratan como SQL que no es NULL.
Por ejemplo:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
Codificación
Los documentos JSON se deben codificar en UTF-8. Las transacciones o consultas con documentos JSON codificados en otros formatos muestran un error.
Crea una tabla con columnas JSON
Se puede agregar una columna JSON a una tabla cuando esta se crea. Los valores de tipo JSON pueden ser anulables.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
Agregado y quitado de las columnas JSON de las tablas existentes
Una columna JSON también se puede agregar y descartar de las tablas existentes.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
En el siguiente ejemplo, se muestra cómo agregar una columna JSON llamada VenueDetails a
la tabla Venues con gcloud CLI y las bibliotecas cliente de
Spanner.
gcloud
gcloud spanner databases ddl update DATABASE_ID \ --instance=INSTANCE_ID \ --ddl="ALTER TABLE Venues ADD COLUMN VenueDetails JSON;"
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifica datos de JSON
En el siguiente ejemplo, se muestra cómo actualizar los datos de JSON con
gcloud CLI y las bibliotecas cliente de Spanner.
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="UPDATE Venues SET VenueDetails = JSON '{\"rating\": 9, \"open\": true}' WHERE VenueId = 1"
C++
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#
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
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
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
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
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
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
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 JSON con índices secundarios y índices de búsqueda con tus datos JSON. Spanner no admite el uso de columnas de tipo JSON 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 JSON. Para usar índices secundarios con JSON, crea una columna generada que extraiga los datos escalares relevantes y convierta los datos en un tipo 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 INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Usa índices de búsqueda
Los índices de búsqueda son útiles cuando consultas documentos JSON que son dinámicos o variados. A diferencia de los índices secundarios, puedes crear índices de búsqueda en cualquier documento JSON almacenado en una columna JSON. 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 TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
SELECT VenueName
FROM Venues
WHERE VenueDetails.open.Friday = true
AND VenueDetails.type IN ("stadium", "arena");
Para obtener más información, consulta Índices de búsqueda de JSON.
Consulta datos JSON
En el siguiente ejemplo, se muestra cómo consultar datos de JSON con
gcloud CLI y las bibliotecas cliente de Spanner.
gcloud
gcloud spanner databases execute-sql DATABASE_ID --instance=INSTANCE_ID \ --sql="SELECT VenueId, VenueDetails FROM Venues \ WHERE JSON_VALUE(VenueDetails, '$.rating') = '9'"
C++
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#
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
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
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
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
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
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
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.
Comparación y ordenamiento
Puedes comparar los valores JSON para verificar la igualdad y el orden. También puedes usar
valores JSON en las cláusulas GROUP BY y ORDER BY. Para acelerar las comparaciones de igualdad
en las columnas JSON o sus rutas de acceso secundarias en transacciones de solo lectura, puedes
usar un índice de búsqueda.
Para obtener reglas y semántica detalladas, consulta Comparación y orden de JSON.
Restricciones
- No puedes usar columnas de tipo JSON como claves primarias ni como claves en índices secundarios. Para obtener más información, consulta Indexa datos JSON.