Cette page explique comment utiliser le type de données JSONB avec Spanner.
JSONB est un type de données PostgreSQL utilisé pour stocker des données semi-structurées dans le dialecte PostgreSQL de Spanner. JSONB contient des données au format JSON (JavaScript Object Notation), qui respecte la spécification décrite dans la RFC 7159.
Spécifications
Le type de données JSONB de Spanner stocke une représentation normalisée du document d'entrée. Cela implique les conséquences suivantes :
- Les guillemets et les caractères d'espacement ne sont pas conservés.
- Les commentaires ne sont pas acceptés. Les transactions ou les requêtes contenant des commentaires échouent.
- Les clés d'objet sont d'abord triées par longueur de clé, puis par ordre lexicographique en fonction de la longueur de clé d'objet équivalente. Si des clés d'objet sont en double, seule la dernière est conservée.
- Les types primitifs (
string,boolean,numberetnull) conservent leur type et leur valeur.- Les valeurs de type
stringsont conservées exactement. - Les zéros de fin sont conservés. Le format de sortie des valeurs de type
numbern'utilise pas la notation scientifique.
- Les valeurs de type
Les valeurs
JSONBnullsont traitées comme des valeurs SQL non-NULL. Exemple :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 NULLL'ordre des éléments du tableau JSONB est conservé.
Restrictions
Les restrictions suivantes s'appliquent à Spanner JSONB :
- Les arguments de la fonction
to_jsonbne peuvent provenir que des types de données PostgreSQL compatibles avec Spanner. - Les valeurs de type Number peuvent comporter 4 932 chiffres avant le séparateur décimal et 16 383 chiffres après.
- La taille maximale autorisée pour le format de stockage normalisé est de 10 Mo.
- Les documents
JSONBdoivent être encodés au format UTF-8. Les transactions ou les requêtes avec des documentsJSONBencodés dans d'autres formats renvoient une erreur.
Comparaison et tri
Vous pouvez comparer les valeurs JSONB pour vérifier l'égalité et l'ordre. Vous pouvez également utiliser des valeurs JSONB dans une clause GROUP BY et ORDER BY.
Lorsque vous comparez des valeurs JSONB de types différents, les relations suivantes s'appliquent :
Null (JSONB null) < String < Number < Boolean < Array < Object
Lorsque vous comparez des valeurs JSONB du même type, les règles suivantes s'appliquent :
- Objets : les objets comportant plus de paires clé/valeur sont supérieurs aux objets comportant moins de paires. Si les deux objets ont le même nombre de paires, leurs paires clé-valeur sont comparées par paires (les clés d'abord, puis les valeurs) dans l'ordre des clés défini dans Spécifications. La première paire qui diffère détermine l'ordre.
- Tableaux : les tableaux comportant plus d'éléments sont supérieurs aux tableaux comportant moins d'éléments. Si les deux tableaux ont le même nombre d'éléments, les éléments sont comparés index par index, de gauche à droite. Le premier élément différent détermine l'ordre du tableau.
- Booléens :
trueest supérieur àfalse. - Nombres : comparés mathématiquement à l'aide de comparaisons de valeurs numériques.
- Chaînes : comparées de manière lexicographique à l'aide des règles standards de comparaison de chaînes.
Valeurs JSONB nulles : toutes les valeurs
JSONBnullsont égales entre elles et inférieures à toute autre valeur JSON non nulle. Toutefois, un cas particulier s'applique :Un tableau de premier niveau vide
[]est considéré comme plus petit qu'une valeur nulle JSONB. Comme cela ne s'applique qu'aux tableaux de premier niveau, les instructions suivantes renvoient la valeur "true" :'[]'::jsonb < 'null'::jsonb'null'::jsonb < '[[]]'::jsonb'[null]'::jsonb < '[[]]'::jsonb
Créer une table avec des colonnes JSONB
Vous pouvez ajouter une colonne JSONB à une table lors de sa création.
CREATE TABLE Venues (
VenueId BIGINT PRIMARY KEY,
VenueName VARCHAR(1024),
VenueAddress VARCHAR(1024),
VenueFeatures JSONB,
DateOpened TIMESTAMPTZ
);
Voici un exemple d'objet VenueFeatures JSONB :
{
"rating": 4.5,
"capacity":"1500",
"construction":"brick",
"tags": [
"multi-cuisine",
"open-seating",
"stage",
"public address system"
]
}
Ajouter et supprimer des colonnes JSONB dans des tables existantes
Vous pouvez ajouter une colonne JSONB et la supprimer à l'aide d'instructions ALTER comme suit :
ALTER TABLE Venues ADD COLUMN VenueDetails JSONB;
ALTER TABLE Venues DROP COLUMN VenueDetails;
L'exemple suivant montre comment ajouter une colonne JSONB appelée VenueDetails à la table Venues à l'aide des bibliothèques clientes Spanner.
C++
C#
Go
Java
Node.js
PHP
Python
Ruby
Modifier des données JSONB
Vous pouvez modifier une colonne JSONB comme n'importe quelle autre colonne.
Voici un exemple :
UPDATE Venues SET VenueFeatures = '{"rating": 4.5, "tags":["multi-cuisine", "open-seating"] }'
WHERE VenueId = 1;
L'exemple suivant montre comment mettre à jour des données JSONB à l'aide des bibliothèques clientes Spanner.
C++
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Indexer des données JSON
Vous pouvez accélérer l'interrogation des données JSONB en utilisant des index secondaires et des index de recherche avec vos données JSONB. Spanner n'est pas compatible avec l'utilisation de colonnes de type JSONB comme clés dans les index secondaires.
Utiliser un index secondaire
Les index secondaires sont utiles pour filtrer les valeurs scalaires d'un document JSONB. Pour utiliser des index secondaires avec JSONB, créez une colonne générée qui extrait les données scalaires pertinentes et les caste vers un type de données SQL approprié. Vous pouvez ensuite créer un index secondaire sur cette colonne générée. L'index accélère les requêtes éligibles qui s'exécutent sur la colonne générée.
Dans l'exemple suivant, vous allez créer un index VenuesByCapacity que la base de données utilise pour trouver les lieux dont la capacité est supérieure à 1 000. Au lieu de vérifier chaque ligne, Spanner utilise l'index pour localiser les lignes pertinentes, ce qui améliore les performances des requêtes, en particulier pour les tables volumineuses.
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;
Utiliser des index de recherche
Les index de recherche sont utiles lorsque vous interrogez des documents JSONB dynamiques ou variés. Contrairement aux index secondaires, vous pouvez créer des index de recherche sur n'importe quel document JSONB stocké dans une colonne JSONB. L'index de recherche s'adapte automatiquement aux variations entre les documents JSON, entre les différentes lignes et au fil du temps.
Dans l'exemple suivant, vous allez créer un index de recherche VenuesByVenueDetails que la base de données utilise pour trouver les lieux avec des détails spécifiques tels que la taille et les horaires d'ouverture. Au lieu de vérifier chaque ligne, Spanner utilise l'index pour localiser les lignes pertinentes, ce qui améliore les performances des requêtes, en particulier pour les tables volumineuses.
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);
Pour en savoir plus, consultez Index de recherche JSON.
Interroger des données JSONB
Vous pouvez interroger les colonnes JSONB en fonction des valeurs des champs sous-jacents. L'exemple suivant extrait VenueId et VenueName de Venues, où VenueFeatures a une valeur rating supérieure à 3.5.
SELECT VenueId, VenueName
FROM Venues
WHERE (VenueFeatures->>'rating')::FLOAT8 > 3.5;
L'exemple suivant montre comment interroger des données JSONB à l'aide des bibliothèques clientes Spanner.
C++
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
C#
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Go
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Java
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Node.js
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
PHP
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Python
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Ruby
Pour savoir comment installer et utiliser la bibliothèque cliente pour Spanner, consultez la page Bibliothèques clientes Spanner.
Pour vous authentifier auprès de Spanner, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
Fonctionnalités JSONB PostgreSQL non compatibles
Les fonctionnalités PostgreSQL JSONB Open Source suivantes ne sont pas compatibles avec Spanner JSONB :
- PrimaryKey et ForeignKey
- Indexation, y compris l'index GIN. Vous pouvez utiliser un index de recherche Spanner à la place, qui accélère les mêmes opérations JSONB qu'un index GIN. Pour en savoir plus, consultez Indexer des données JSON.
- Modifier une colonne
JSONBvers ou depuis n'importe quel autre type de données - Utiliser des requêtes paramétrées avec des paramètres JSONB non typés dans des outils qui utilisent le protocole filaire PostgreSQL
Utiliser la coercition dans le moteur de requête. Contrairement à PostgreSQL Open Source, la coercition implicite de
JSONBen texte n'est pas acceptée. Vous devez utiliser un cast explicite à partir du typeJSONBpour qu'il corresponde aux signatures de fonction. Exemple :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