TairDoc est une structure de données documentaire similaire à RedisJSON. Utilisez-la pour stocker, interroger et manipuler des documents JSON avec une prise en charge complète des opérations CRUD (création, lecture, mise à jour, suppression).
Fonctionnalités clés :
Prise en charge complète du standard JSON
Prise en charge de JSONPath (RFC draft-4) via
JSON.GET; les sélecteurs spécifiques, notamment les sélecteurs génériques par point, d'index et de filtre, nécessitent la version 1.8.4 ou ultérieurePrise en charge complète de la syntaxe JSON Pointer (RFC 6901)
Stockage sous forme d'arbre binaire pour une récupération efficace des éléments enfants
Conversion JSON vers XML et JSON vers YAML via
JSON.GET
Notes de version :
TairDoc a été lancé avec les instances Tair optimisées pour la mémoire. Il prend en charge la syntaxe JSONPointer complète et une partie de la syntaxe JSONPath (seule
JSON.GETprend en charge la syntaxe JSONPath).Le 17 mai 2022, TairDoc V1.8.4 a été publié avec une prise en charge complète de JSONPath pour
JSON.GET, incluant le sélecteur générique par point, le sélecteur d'index et le sélecteur de filtre. Nous vous recommandons de mettre à jour la version mineure de votre instance vers la version 1.8.4 ou ultérieure.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance Tair basée sur DRAM
Version mineure de l'instance 1.8.4 ou ultérieure (requise pour la prise en charge complète de JSONPath via
JSON.GET)
Pour mettre à jour votre instance vers la dernière version mineure, consultez la rubrique Mettre à jour la version mineure d'une instance.
Pour les instances en cluster ou avec répartition lecture/écriture, mettez à jour les nœuds proxy vers la dernière version mineure afin de garantir le bon fonctionnement de toutes les commandes.
Liste des commandes
| Commande | Description | Complexité temporelle |
|---|---|---|
| JSON.SET | Crée une clé TairDoc ou met à jour un élément JSON à un chemin donné | O(N) |
| JSON.GET | Récupère un élément JSON à partir d'un chemin donné | O(N) |
| JSON.DEL | Supprime un élément JSON ou une clé | O(N) |
| JSON.TYPE | Obtient le type d'un élément JSON | O(N) |
| JSON.MERGE | Fusionne une valeur JSON dans un chemin donné | O(N) |
| JSON.NUMINCRBY | Incrémente un élément JSON numérique | O(N) |
| JSON.STRAPPEND | Ajoute une chaîne à la fin d'un élément de chaîne JSON | O(N) |
| JSON.STRLEN | Obtient la longueur d'un élément de chaîne JSON | O(N) |
| JSON.ARRAPPEND | Ajoute des éléments à la fin d'un tableau | O(M×N) |
| JSON.ARRPOP | Supprime et renvoie un élément d'un tableau | O(M×N) |
| JSON.ARRINSERT | Insère des éléments avant un index donné dans un tableau | O(M×N) |
| JSON.ARRLEN | Obtient la longueur d'un tableau | O(N) |
| JSON.ARRTRIM | Tronque un tableau à une plage spécifiée | O(N) |
| DEL | Supprime une ou plusieurs clés TairDoc (commande Redis native) | — |
Conventions de syntaxe utilisées dans cette référence :
MAJUSCULES: mot-clé de commande_italique_: variable[option]: paramètre facultatifA | B: options mutuellement exclusives...: le paramètre peut être répété
JSON.SET
Syntaxe : JSON.SET clé chemin json [NX | XX]
Crée une clé TairDoc et stocke un élément JSON au chemin spécifié. Si la clé et le chemin existent déjà, met à jour l'élément.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin au sein de la clé. Utilisez . ou $ pour la racine |
json |
L'élément JSON à stocker |
NX |
Écrit uniquement si le chemin n'existe pas |
XX |
Écrit uniquement si le chemin existe déjà |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | OK |
XX spécifié mais le chemin n'existe pas |
nil |
NX spécifié mais le chemin existe déjà |
nil |
| Chemin invalide | ERR could not find object to add, please check path |
Exemple — créer un document JSON :
La commande suivante crée une clé doc au chemin racine ($) et stocke un document de librairie contenant quatre livres et un vélo :
JSON.SET doc $ '{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }'
Sortie attendue :
OK
JSON.GET
Syntaxe : JSON.GET clé chemin [FORMAT XML | YAML] [ROOTNAME racine] [ARRNAME tab]
Récupère l'élément JSON au chemin spécifié. Prend en charge les syntaxes JSONPath et JSON Pointer.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin au sein de la clé. Accepte la syntaxe JSONPath (style $) et JSON Pointer (style .) |
FORMAT |
Format de sortie : XML ou YAML. Si omis, renvoie du JSON |
ROOTNAME |
Nom de balise pour l'élément racine en sortie XML. Valide uniquement lorsque FORMAT XML est défini |
ARRNAME |
Nom de balise pour les éléments de tableau en sortie XML. Valide uniquement lorsque FORMAT XML est défini |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | L'élément JSON au chemin spécifié |
| Erreur | Message d'erreur |
Exemple — récupérer un document au format XML :
Tout d'abord, créez le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Ensuite, récupérez-le au format XML, en spécifiant ROOT comme nom de balise racine et ARR comme nom de balise de tableau :
JSON.GET doc . FORMAT XML ROOTNAME ROOT ARRNAME ARR
Sortie attendue :
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><foo>bar</foo><baz>42</baz></ROOT>"
JSON.DEL
Syntaxe : JSON.DEL clé chemin
Supprime l'élément JSON au chemin spécifié. Si aucun chemin n'est indiqué, supprime la clé entière. Ne fait rien silencieusement si la clé ou le chemin n'existe pas.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin de l'élément à supprimer. Si omis, la clé entière est supprimée |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | 1 |
| Clé ou chemin introuvable | 0 |
Exemple — supprimer un champ :
Tout d'abord, créez le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Supprimez le champ foo :
JSON.DEL doc .foo
Sortie attendue — 1 indique que l'élément a été supprimé :
(integer) 1
JSON.TYPE
Syntaxe : JSON.TYPE key path
Renvoie le type de l'élément JSON situé au chemin spécifié.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin de l'élément |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | L'une des valeurs suivantes : boolean, string, number, array, object, raw, reference, const, null |
| Échec | 0 |
| Clé ou chemin introuvable | nil |
Exemple — obtenir le type d'un champ :
Commencez par créer le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenez le type du champ foo ("bar" est une chaîne de caractères) :
JSON.TYPE doc .foo
Sortie attendue :
string
JSON.MERGE
Syntaxe : JSON.MERGE key path value
Fusionne une valeur JSON dans le chemin spécifié. Cette commande permet d'ajouter de nouvelles valeurs, de mettre à jour des valeurs existantes et de supprimer des valeurs au niveau du chemin indiqué.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin cible pour la fusion. Prend en charge une syntaxe JSONPath partielle (par exemple, $.a.b.c, $.a['b']). N'accepte pas les expressions de descente récursive ($..) ni les jokers ($*) |
value |
La valeur JSON à fusionner. Compatible avec le JSON Merge Patch (RFC 7386) |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | OK |
| Valeur invalide | Erreur (échec de l'analyse du correctif de fusion) |
Exemple — ajouter, mettre à jour et supprimer des valeurs en une seule opération :
Commencez par créer le document :
JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
Fusionnez les modifications : définissez f1 sur null (ce qui le supprime), mettez à jour f2.a et ajoutez f2.b, puis ajoutez un nouveau tableau f3 :
JSON.MERGE doc $ '{"f1": null, "f2":{"a":3, "b":4}, "f3":[2,4,6]}'
Sortie attendue :
OK
Vérifiez le résultat avec JSON.GET doc .. La clé f1 est supprimée, car définir un champ sur null dans un correctif de fusion entraîne sa suppression :
"{\"f2\":{\"a\":3,\"b\":4},\"f3\":[2,4,6]}"
JSON.NUMINCRBY
Syntaxe : JSON.NUMINCRBY key path value
Incrémente l'élément JSON numérique situé au chemin spécifié. L'élément existant et la valeur d'incrément doivent être du même type, soit entier, soit double.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin de l'élément numérique |
value |
Montant à ajouter |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Nouvelle valeur après incrémentation |
| Clé ou chemin introuvable | Erreur |
Exemple — incrémenter un champ numérique :
Commencez par créer le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Incrémentez baz de 10 (42 + 10 = 52) :
JSON.NUMINCRBY doc .baz 10
Sortie attendue :
"52"
JSON.STRAPPEND
Syntaxe : JSON.STRAPPEND key path json-string
Ajoute une chaîne à l'élément de chaîne JSON situé au chemin spécifié. L'élément existant et la valeur ajoutée doivent tous deux être de type string.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin de l'élément de chaîne |
json-string |
Chaîne à ajouter |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Nouvelle longueur de la chaîne |
| Clé introuvable | -1 |
Exemple — ajouter du texte à un champ de chaîne :
Commencez par créer le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Ajoutez rrrrr à foo : "bar" devient "barrrrrr", soit 8 caractères :
JSON.STRAPPEND doc .foo rrrrr
Sortie attendue :
(integer) 8
JSON.STRLEN
Syntaxe : JSON.STRLEN key path
Renvoie la longueur en caractères de l'élément de chaîne JSON situé au chemin spécifié. L'élément doit être de type string.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin de l'élément de chaîne |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Longueur de la chaîne |
| Clé introuvable | -1 |
Exemple — obtenir la longueur d'un champ de chaîne :
Commencez par créer le document :
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Obtenez la longueur de foo : "bar" contient 3 caractères :
JSON.STRLEN doc .foo
Sortie attendue :
(integer) 3
JSON.ARRAPPEND
Syntaxe : JSON.ARRAPPEND key path json [json ...]
Ajoute un ou plusieurs éléments JSON à la fin d'un tableau. La complexité temporelle est de O(M×N), où M représente le nombre d'éléments à ajouter et N la longueur actuelle du tableau.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin du tableau |
json |
Un ou plusieurs éléments JSON à ajouter |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Nouvelle longueur du tableau |
| Clé introuvable | -1 |
Exemple — ajouter plusieurs éléments à un tableau :
Commencez par créer le document :
JSON.SET doc . '{"id": [1,2,3]}'
Ajoutez null, false et true au tableau id. Le tableau passe de 3 à 6 éléments :
JSON.ARRAPPEND doc .id null false true
Sortie attendue :
(integer) 6
JSON.ARRPOP
Syntaxe : JSON.ARRPOP key path [index]
Supprime et renvoie l'élément situé à l'index spécifié dans un tableau. La complexité temporelle est de O(M×N), où M représente le nombre d'éléments enfants dans la clé et N la longueur du tableau.
Paramètres :
| Paramètre | Description |
|---|---|
key |
La clé TairDoc |
path |
Chemin du tableau |
index |
Index de l'élément à supprimer. Commence à 0 ; les valeurs négatives comptent à partir de la fin. Si omis, la valeur par défaut est le dernier élément |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Élément supprimé |
| Tableau vide | ERR array index outflow |
Exemple — supprimer le premier élément d'un tableau :
Commencez par créer le document :
JSON.SET doc . '{"id": [1,2,3]}'
Supprimez et renvoyez l'élément à l'index 0 (le premier élément, 1) :
JSON.ARRPOP doc .id 0
Sortie attendue :
"1"
JSON.ARRINSERT
Syntaxe : JSON.ARRINSERT key path [index] json [json ...]
Insère un ou plusieurs éléments JSON dans un tableau avant l'index spécifié. La complexité temporelle est de O(M×N), où M représente le nombre d'éléments à insérer et N la longueur actuelle du tableau.
Paramètres :
| Paramètre | description |
|---|---|
key |
Clé TairDoc |
path |
Chemin d'accès du tableau |
index |
Position avant laquelle l'insertion doit avoir lieu. Commence à 0 ; les valeurs négatives sont comptées à partir de la fin. Si ce paramètre est omis, la dernière position est utilisée par défaut |
json |
Un ou plusieurs éléments JSON à insérer |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Nouvelle longueur du tableau |
| Le tableau est vide | ERR array index outflow |
Exemple : insertion d'éléments au début d'un tableau
Commencez par créer le document :
JSON.SET doc . '{"id": [1,2,3]}'
Insérez 10 et 15 avant l'index 0. Le tableau résultant est [10, 15, 1, 2, 3] :
JSON.ARRINSERT doc .id 0 10 15
Sortie attendue :
(integer) 5
JSON.ARRLEN
Syntaxe : JSON.ARRLEN key path
Renvoie le nombre d'éléments contenus dans un tableau.
Paramètres :
| Paramètre | description |
|---|---|
key |
Clé TairDoc |
path |
Chemin d'accès du tableau |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Longueur du tableau |
| Clé introuvable | -1 |
Exemple : obtention de la longueur d'un tableau
Commencez par créer le document :
JSON.SET doc . '{"id": [1,2,3]}'
Obtenez le nombre d'éléments du tableau id :
JSON.ARRLEN doc .id
Sortie attendue :
(integer) 3
JSON.ARRTRIM
Syntaxe : JSON.ARRTRIM key path start stop
Découpe un tableau afin de ne conserver que les éléments situés dans la plage [start, stop] (bornes incluses). Tous les éléments extérieurs à cette plage sont supprimés.
Paramètres :
| Paramètre | description |
|---|---|
key |
Clé TairDoc |
path |
Chemin d'accès du tableau |
start |
Index de début (base 0, inclus) |
stop |
Index de fin (base 0, inclus) |
Valeurs de retour :
| Résultat | Valeur de retour |
|---|---|
| Succès | Longueur du tableau après découpage |
| Clé introuvable | -1 |
Exemple : découpage d'un tableau vers une sous-plage
Commencez par créer le document :
JSON.SET doc . '{"id": [1,2,3,4,5,6]}'
Découpez le tableau pour ne conserver que les éléments aux index 3 et 4 (valeurs 4 et 5). Les éléments situés en dehors de cette plage sont ignorés :
JSON.ARRTRIM doc .id 3 4
Sortie attendue — 2 éléments restent :
(integer) 2
JSONPath
La commande JSON.GET prend en charge la syntaxe du projet de norme JSONPath RFC draft-4 pour des requêtes flexibles. La prise en charge complète de JSONPath nécessite la version 1.8.4 ou ultérieure.
Sélecteurs pris en charge :
| Sélecteur | Description | ||
|---|---|---|---|
$ |
Élément racine | ||
@ |
Élément courant | ||
.name |
Élément enfant | ||
.. |
Éléments descendants | ||
* |
Caractère générique — tous les éléments enfants ou éléments de tableau | ||
[ ] |
Index de tableau (indice de base 0) ; prend en charge les listes ([0,1]) et les noms d'éléments (['name']) |
||
[start:end:step] |
Sélecteur de tranche de tableau | ||
?... |
Sélecteur de filtre | ||
() |
Expression ; priorité des opérateurs : `( ) > && > \ | \ | ` |
Exemples de requête :
Les exemples suivants utilisent ce document de librairie. Créez-le d'abord :
JSON.SET dockey $
'{
"store": {
"book": [{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
}'
Résultat attendu :
OK
Sélecteur racine
Interrogez l'intégralité de l'objet JSON :
JSON.GET dockey $
Résultat attendu :
"[{"store":{"book":[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}],"bicycle":{"color":"red","price":19.95}}}]"
Sélecteur par point
Interrogez tous les champs du vélo :
JSON.GET dockey $.store.bicycle.*
Résultat attendu :
"["red",19.95]"
Interrogez le prix du vélo :
JSON.GET dockey $.store.bicycle.price
Résultat attendu :
"[19.95]"
Sélecteur d'index
Interrogez tous les champs du premier livre :
JSON.GET dockey $.store.book[0]
Résultat attendu :
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}]"
Interrogez les titres de tous les livres :
JSON.GET dockey "$.store.book[*]['title']"
Résultat attendu :
"["Sayings of the Century","Sword of Honour","Moby Dick","The Lord of the Rings"]"
Sélecteur de tranche de tableau
Interrogez les trois premiers livres à l'aide d'une tranche avec un pas de 1 :
JSON.GET dockey $.store.book[0:2:1]
Résultat attendu :
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]"
Sélecteur descendant
Interrogez tous les prix dans le magasin (livres et vélo) :
JSON.GET dockey $..price
Résultat attendu :
"[8.95,12.99,8.99,22.99,19.95]"
Sélecteur de liste
Interrogez le premier et le troisième livre :
JSON.GET dockey $.store.book[0,2]
Résultat attendu :
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]"
Sélecteur de filtre
Interrogez les livres qui possèdent un champ isbn :
JSON.GET dockey $.store.book[?(@.isbn)]
Résultat attendu :
"[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]"
Interrogez les livres dont le prix est inférieur à 10 :
JSON.GET dockey '$.store.book[?(@.price < 10)]'
Résultat attendu :
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]"
Interrogez les livres dont le prix est de 12,99, supérieur à 19,95, ou appartenant à la catégorie reference (expression combinée) :
JSON.GET dockey "$..book[?((@.price == 12.99 || @.price > $.store.bicycle.price) || @.category == 'reference')]"
Résultat attendu :
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95},{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99},{"category":"fiction","author":"Evelyn Waugh","title":"Sword of Honour","price":12.99}]"
Pointeur JSON
TairDoc prend entièrement en charge la syntaxe JSON Pointer (RFC 6901). Utilisez des chemins délimités par / pour naviguer dans un document.
Exemple : récupération d'un élément de tableau imbriqué :
Commencez par créer le document :
JSON.SET doc . '{"foo": "bar", "baz" : [1,2,3]}'
Récupérez le premier élément du tableau baz à l'aide du chemin JSON Pointer /baz/0 :
JSON.GET doc /baz/0
Résultat attendu :
"1"