TairDoc, RedisJSON benzeri bir belge veri yapısıdır. Tam CRUD desteğiyle JSON belgelerini depolamak, sorgulamak ve değiştirmek için kullanın.
Temel özellikler:
Tam JSON standardı desteği
JSON.GETaracılığıyla JSONPath desteği (RFC taslağı-4); nokta joker karakteri, dizin ve filtre seçicileri gibi belirli seçiciler için sürüm 1.8.4 veya üzeri gerekirTam JSON Pointer sözdizimi desteği (RFC 6901)
Alt öğelerin verimli şekilde alınması için ikili ağaç depolama
JSON.GETaracılığıyla JSON'dan XML'e ve JSON'dan YAML'e dönüştürme
Sürüm notları:
TairDoc, Tair bellek optimize edilmiş örneklerle birlikte piyasaya sürüldü. Tam JSONPointer sözdizimini ve kısmi JSONPath sözdizimini destekler (yalnızca
JSON.GETJSONPath sözdizimini destekler).17 Mayıs 2022'de,
JSON.GETiçin tam JSONPath desteğiyle TairDoc V1.8.4 sürümü yayınlandı; bu sürüm nokta joker karakteri seçicisini, dizin seçicisini ve filtre seçicisini içerir. Örneğinizin küçük sürümünü 1.8.4 veya daha yeni bir sürüme güncellemenizi öneririz.
Ön Koşullar
Başlamadan önce şunlara sahip olduğunuzdan emin olun:
Bir Tair DRAM tabanlı örnek
Örnek küçük sürümü 1.8.4 veya üzeri (
JSON.GETaracılığıyla tam JSONPath desteği için gereklidir)
Örneğinizi en son küçük sürüme güncellemek için bkz. Örneğin küçük sürümünü güncelleme.
Küme veya okuma/yazma ayrımı yapan örnekler için, tüm komutların beklendiği gibi çalışmasını sağlamak üzere proxy düğümlerini en son küçük sürüme güncelleyin.
Komut listesi
| Komut | Açıklama | Zaman karmaşıklığı |
|---|---|---|
| JSON.SET | Bir TairDoc anahtarı oluşturun veya bir yoldaki JSON öğesini güncelleyin | O(N) |
| JSON.GET | Bir yoldan bir JSON öğesi alın | O(N) |
| JSON.DEL | Bir JSON öğesini veya anahtarı silin | O(N) |
| JSON.TYPE | Bir JSON öğesinin türünü alın | O(N) |
| JSON.MERGE | Bir JSON değerini bir yolla birleştirin | O(N) |
| JSON.NUMINCRBY | Sayısal bir JSON öğesini artırın | O(N) |
| JSON.STRAPPEND | Bir JSON dize öğesine dize ekleyin | O(N) |
| JSON.STRLEN | Bir JSON dize öğesinin uzunluğunu alın | O(N) |
| JSON.ARRAPPEND | Bir dizinin sonuna öğeler ekleyin | O(M×N) |
| JSON.ARRPOP | Bir diziden bir öğeyi kaldırın ve döndürün | O(M×N) |
| JSON.ARRINSERT | Bir dizide verilen dizinden önce öğeler ekleyin | O(M×N) |
| JSON.ARRLEN | Bir dizinin uzunluğunu alın | O(N) |
| JSON.ARRTRIM | Bir diziyi belirtilen aralığa kırpın | O(N) |
| DEL | Bir veya daha fazla TairDoc anahtarını silin (yerel Redis komutu) | — |
Bu referansta kullanılan sözdizimi kuralları:
BÜYÜK HARF: komut anahtar kelimesi_italik_: değişken[seçenek]: isteğe bağlı parametreA | B: birbirini dışlayan seçenekler...: parametre tekrar edilebilir
JSON.SET
Sözdizimi: JSON.SET anahtar yol json [NX | XX]
Bir TairDoc anahtarı oluşturur ve belirtilen yolda bir JSON öğesi depolar. Anahtar ve yol zaten varsa öğeyi günceller.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Anahtar içindeki yol. Kök için . veya $ kullanın |
json |
Depolanacak JSON öğesi |
NX |
Yalnızca yol yoksa yazın |
XX |
Yalnızca yol zaten varsa yazın |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | OK |
XX belirtildi ancak yol yok |
nil |
NX belirtildi ancak yol zaten var |
nil |
| Geçersiz yol | ERR could not find object to add, please check path |
Örnek — JSON belgesi oluşturma:
Aşağıdaki komut, kök yolda ($) bir doc anahtarı oluşturur ve dört kitap ile bir bisiklet içeren bir kitapçı belgesi depolar:
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 } } }'
Beklenen çıktı:
OK
JSON.GET
Sözdizimi: JSON.GET anahtar yol [FORMAT XML | YAML] [ROOTNAME kök] [ARRNAME dizi]
Belirtilen yoldaki JSON öğesini alır. Hem JSONPath hem de JSON Pointer sözdizimini destekler.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Anahtar içindeki yol. JSONPath ($ stili) ve JSON Pointer (. stili) sözdizimini kabul eder |
FORMAT |
Çıktı biçimi: XML veya YAML. Atlanırsa JSON döndürür |
ROOTNAME |
XML çıktısında kök öğe için etiket adı. Yalnızca FORMAT XML ayarlandığında geçerlidir |
ARRNAME |
XML çıktısında dizi öğeleri için etiket adı. Yalnızca FORMAT XML ayarlandığında geçerlidir |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Belirtilen yoldaki JSON öğesi |
| Hata | Hata mesajı |
Örnek — belgeyi XML olarak alma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
Ardından, kök etiket adı olarak ROOT ve dizi etiket adı olarak ARR belirterek XML olarak alın:
JSON.GET doc . FORMAT XML ROOTNAME ROOT ARRNAME ARR
Beklenen çıktı:
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ROOT><foo>bar</foo><baz>42</baz></ROOT>"
JSON.DEL
Sözdizimi: JSON.DEL anahtar yol
Belirtilen yoldaki JSON öğesini siler. Yol verilmezse tüm anahtarı siler. Anahtar veya yol yoksa sessizce hiçbir işlem yapmaz.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Silinecek öğenin yolu. Atlanırsa tüm anahtar silinir |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | 1 |
| Anahtar veya yol bulunamadı | 0 |
Örnek — alan silme:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
foo alanını silin:
JSON.DEL doc .foo
Beklenen çıktı — 1 öğenin silindiğini gösterir:
(integer) 1
JSON.TYPE
Sözdizimi: JSON.TYPE anahtar yol
Belirtilen yoldaki JSON öğesinin türünü döndürür.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Öğenin yolu |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Şunlardan biri: boolean, string, number, array, object, raw, reference, const, null |
| Başarısız | 0 |
| Anahtar veya yol bulunamadı | nil |
Örnek — alanın türünü alma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
foo alanının türünü alın ("bar" bir dizedir):
JSON.TYPE doc .foo
Beklenen çıktı:
string
JSON.MERGE
Sözdizimi: JSON.MERGE anahtar yol değer
Bir JSON değerini belirtilen yolla birleştirir. Yeni değerler eklemeyi, mevcut değerleri güncellemeyi ve belirtilen yoldaki değerleri silmeyi destekler.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Birleştirilecek yol. Kısmi JSONPath sözdizimini destekler (ör. $.a.b.c, $.a['b']). Özyinelemeli azaltmayı ($..) veya joker karakter ($*) ifadelerini desteklemez |
value |
Birleştirilecek JSON değeri. JSON Merge Patch (RFC 7386) ile uyumludur |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | OK |
| Geçersiz değer | Hata (birleştirme yaması ayrıştırılamadı) |
Örnek — tek işlemde değer ekleme, güncelleme ve silme:
Önce belgeyi oluşturun:
JSON.SET doc $ '{"f1": {"a":1}, "f2":{"a":2}}'
Değişiklikleri birleştirin: f1 değerini null olarak ayarlayın (silinir), f2.a değerini güncelleyin ve f2.b ekleyin ve yeni bir f3 dizisi ekleyin:
JSON.MERGE doc $ '{"f1": null, "f2":{"a":3, "b":4}, "f3":[2,4,6]}'
Beklenen çıktı:
OK
Sonucu JSON.GET doc . ile doğrulayın. Birleştirme yamasında bir alanı null olarak ayarlamak onu sildiğinden f1 anahtarı kaldırılır:
"{\"f2\":{\"a\":3,\"b\":4},\"f3\":[2,4,6]}"
JSON.NUMINCRBY
Sözdizimi: JSON.NUMINCRBY anahtar yol değer
Belirtilen yoldaki sayısal JSON öğesini artırır. Hem mevcut öğe hem de artış değeri aynı türde olmalıdır — tamsayı veya ondalık sayı.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Sayısal öğenin yolu |
value |
Eklenecek miktar |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Artırımdan sonraki yeni değer |
| Anahtar veya yol bulunamadı | Hata |
Örnek — sayısal alanı artırma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
baz değerini 10 artırın (42 + 10 = 52):
JSON.NUMINCRBY doc .baz 10
Beklenen çıktı:
"52"
JSON.STRAPPEND
Sözdizimi: JSON.STRAPPEND anahtar yol json-dizesi
Belirtilen yoldaki JSON dize öğesine bir dize ekler. Hem mevcut öğe hem de eklenen değer string türünde olmalıdır.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dize öğesinin yolu |
json-string |
Eklenecek dize |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Dizenin yeni uzunluğu |
| Anahtar bulunamadı | -1 |
Örnek — dize alanına ekleme yapma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
foo değerine rrrrr ekleyin — "bar" değeri "barrrrrr" olur ve 8 karakter uzunluğundadır:
JSON.STRAPPEND doc .foo rrrrr
Beklenen çıktı:
(integer) 8
JSON.STRLEN
Sözdizimi: JSON.STRLEN anahtar yol
Belirtilen yoldaki JSON dize öğesinin karakter uzunluğunu döndürür. Öğe string türünde olmalıdır.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dize öğesinin yolu |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Dizenin uzunluğu |
| Anahtar bulunamadı | -1 |
Örnek — dize alanının uzunluğunu alma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : 42}'
foo değerinin uzunluğunu alın — "bar" 3 karakter uzunluğundadır:
JSON.STRLEN doc .foo
Beklenen çıktı:
(integer) 3
JSON.ARRAPPEND
Sözdizimi: JSON.ARRAPPEND anahtar yol json [json ...]
Bir veya daha fazla JSON öğesini bir dizinin sonuna ekler. Zaman karmaşıklığı O(M×N)'dir; burada M eklenecek öğe sayısı, N ise mevcut dizi uzunluğudur.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dizinin yolu |
json |
Eklenecek bir veya daha fazla JSON öğesi |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Dizinin yeni uzunluğu |
| Anahtar bulunamadı | -1 |
Örnek — diziye birden çok öğe ekleme:
Önce belgeyi oluşturun:
JSON.SET doc . '{"id": [1,2,3]}'
id dizisine null, false ve true ekleyin. Dizi 3 öğeden 6 öğeye çıkar:
JSON.ARRAPPEND doc .id null false true
Beklenen çıktı:
(integer) 6
JSON.ARRPOP
Sözdizimi: JSON.ARRPOP anahtar yol [dizin]
Bir dizide belirtilen dizindeki öğeyi kaldırır ve döndürür. Zaman karmaşıklığı O(M×N)'dir; burada M anahtardaki alt öğe sayısı, N ise dizi uzunluğudur.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dizinin yolu |
index |
Kaldırılacak öğenin dizini. 0 ile başlar; negatif değerler sondan sayılır. Atlanırsa varsayılan olarak son öğe kullanılır |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Kaldırılan öğe |
| Dizi boş | ERR array index outflow |
Örnek — dizinin ilk öğesini kaldırma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"id": [1,2,3]}'
0 dizinindeki öğeyi (ilk öğe, 1) kaldırın ve döndürün:
JSON.ARRPOP doc .id 0
Beklenen çıktı:
"1"
JSON.ARRINSERT
Sözdizimi: JSON.ARRINSERT anahtar yol [dizin] json [json ...]
Bir veya daha fazla JSON öğesini bir diziye belirtilen dizinden önce ekler. Zaman karmaşıklığı O(M×N)'dir; burada M eklenecek öğe sayısı, N ise mevcut dizi uzunluğudur.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dizinin yolu |
index |
Öncesine eklenecek konum. 0 ile başlar; negatif değerler sondan sayılır. Atlanırsa varsayılan olarak son konum kullanılır |
json |
Eklenecek bir veya daha fazla JSON öğesi |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Dizinin yeni uzunluğu |
| Dizi boş | ERR array index outflow |
Örnek — dizinin başına öğe ekleme:
Önce belgeyi oluşturun:
JSON.SET doc . '{"id": [1,2,3]}'
0 dizininden önce 10 ve 15 ekleyin. Sonuçta oluşan dizi [10, 15, 1, 2, 3] olur:
JSON.ARRINSERT doc .id 0 10 15
Beklenen çıktı:
(integer) 5
JSON.ARRLEN
Sözdizimi: JSON.ARRLEN anahtar yol
Bir dizideki öğe sayısını döndürür.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dizinin yolu |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Dizinin uzunluğu |
| Anahtar bulunamadı | -1 |
Örnek — dizinin uzunluğunu alma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"id": [1,2,3]}'
id dizisindeki öğe sayısını alın:
JSON.ARRLEN doc .id
Beklenen çıktı:
(integer) 3
JSON.ARRTRIM
Sözdizimi: JSON.ARRTRIM anahtar yol başlangıç bitiş
Bir diziyi yalnızca [başlangıç, bitiş] aralığındaki (dahil) öğelerin kalacak şekilde kırpar. Bu aralığın dışındaki tüm öğeler kaldırılır.
Parametreler:
| Parametre | Açıklama |
|---|---|
key |
TairDoc anahtarı |
path |
Dizinin yolu |
start |
Başlangıç dizini (0 tabanlı, dahil) |
stop |
Bitiş dizini (0 tabanlı, dahil) |
Dönüş değerleri:
| Sonuç | Dönüş değeri |
|---|---|
| Başarılı | Kırpıldıktan sonra dizinin uzunluğu |
| Anahtar bulunamadı | -1 |
Örnek — diziyi alt aralığa kırpma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"id": [1,2,3,4,5,6]}'
Diziyi yalnızca 3 ve 4 dizinlerindeki öğeleri (değerler 4 ve 5) tutacak şekilde kırpın. Bu aralığın dışındaki öğeler atılır:
JSON.ARRTRIM doc .id 3 4
Beklenen çıktı — 2 öğe kalır:
(integer) 2
JSONPath
JSON.GET esnek sorgular için JSONPath RFC taslağı-4 sözdizimini destekler. Tam JSONPath desteği için sürüm 1.8.4 veya üzeri gerekir.
Desteklenen seçiciler:
| Seçici | Açıklama | ||
|---|---|---|---|
$ |
Kök öğe | ||
@ |
Geçerli öğe | ||
.name |
Alt öğe | ||
.. |
Torun öğeler | ||
* |
Joker karakter — tüm alt veya dizi öğeleri | ||
[ ] |
Dizi dizini (0 tabanlı); listeleri ([0,1]) ve öğe adlarını (['name']) destekler |
||
[start:end:step] |
Dizi dilimleme seçicisi | ||
?... |
Filtre seçicisi | ||
() |
İfade; işleç önceliği: `( ) > && > | ` |
Sorgu örnekleri:
Aşağıdaki örnekler bu kitapçı belgesini kullanır. Önce oluşturun:
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
}'
Beklenen çıktı:
OK
Kök seçici
Tüm JSON nesnesini sorgulayın:
JSON.GET dockey $
Beklenen çıktı:
"[{"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}}}]"
Nokta seçici
Bisikletin tüm alanlarını sorgulayın:
JSON.GET dockey $.store.bicycle.*
Beklenen çıktı:
"["red",19.95]"
Bisiklet fiyatını sorgulayın:
JSON.GET dockey $.store.bicycle.price
Beklenen çıktı:
"[19.95]"
Dizin seçici
İlk kitabın tüm alanlarını sorgulayın:
JSON.GET dockey $.store.book[0]
Beklenen çıktı:
"[{"category":"reference","author":"Nigel Rees","title":"Sayings of the Century","price":8.95}]"
Tüm kitapların başlıklarını sorgulayın:
JSON.GET dockey "$.store.book[*]['title']"
Beklenen çıktı:
"["Sayings of the Century","Sword of Honour","Moby Dick","The Lord of the Rings"]"
Dizi dilimleme seçicisi
Adım 1 olan bir dilim kullanarak ilk üç kitabı sorgulayın:
JSON.GET dockey $.store.book[0:2:1]
Beklenen çıktı:
"[{"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}]"
Torun seçici
Mağazadaki tüm fiyatları (hem kitaplar hem de bisiklet) sorgulayın:
JSON.GET dockey $..price
Beklenen çıktı:
"[8.95,12.99,8.99,22.99,19.95]"
Liste seçici
İlk ve üçüncü kitapları sorgulayın:
JSON.GET dockey $.store.book[0,2]
Beklenen çıktı:
"[{"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}]"
Filtre seçici
isbn alanı olan kitapları sorgulayın:
JSON.GET dockey $.store.book[?(@.isbn)]
Beklenen çıktı:
"[{"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}]"
Fiyatı 10'un altında olan kitapları sorgulayın:
JSON.GET dockey '$.store.book[?(@.price < 10)]'
Beklenen çıktı:
"[{"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}]"
Fiyatı 12,99 olan, fiyatı 19,95'in üzerinde olan veya reference kategorisindeki kitapları sorgulayın (birleşik ifade):
JSON.GET dockey "$..book[?((@.price == 12.99 || @.price > $.store.bicycle.price) || @.category == 'reference')]"
Beklenen çıktı:
"[{"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}]"
JSON Pointer
TairDoc, JSON Pointer sözdizimini (RFC 6901) tam olarak destekler. Bir belgeye gitmek için / ile ayrılmış yolları kullanın.
Örnek — iç içe geçmiş dizi öğesini alma:
Önce belgeyi oluşturun:
JSON.SET doc . '{"foo": "bar", "baz" : [1,2,3]}'
JSON Pointer yolu /baz/0 kullanarak baz dizisinin ilk öğesini alın:
JSON.GET doc /baz/0
Beklenen çıktı:
"1"