翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
JSON データ型の概要
ElastiCache は、 JSON データ型を操作するために多数の Valkey コマンドと Redis OSS コマンドをサポートしています。以下に示しているのは、 JSON データ型の概要と、サポートされているコマンドの詳細なリストです。
用語
言葉 | 説明 |
---|---|
JSON ドキュメント |
JSON キーの値を指します。 |
JSON 値 |
JSON ドキュメント全体を表すルートを含む、ドキュメントのサブセットを指します。値は、コンテナまたはコンテナ内のエントリにすることができます。 |
JSON 要素 |
JSON 値に相当します。 |
サポートされているJSON標準
JSON 形式は、RFC7159
ルート要素
ルート要素は任意のJSONデータ型にすることができます。4627 RFC 年より前のバージョンでは、ルート値として許可されているのはオブジェクトまたは配列のみです。7159 RFC への更新以降、JSONドキュメントのルートは任意のJSONデータ型にすることができます。
ドキュメントサイズの制限
JSON ドキュメントは、迅速なアクセスと変更のために最適化された形式で内部的に保存されます。通常、この形式では、同じドキュメントのシリアル化された同等の表現よりもいくらか多くのメモリを消費することになります。
1 つのJSONドキュメントによるメモリの消費は 64 MB に制限されています。これは、JSON文字列ではなく、メモリ内データ構造のサイズです。JSON.DEBUG MEMORY
コマンドを使用して、JSONドキュメントが消費するメモリの量を確認できます。
JSON ACLs
既存のデータ型ごとのカテゴリ (@string、@hash など) と同様に、JSONコマンドとデータへのアクセス管理を簡素化するために新しいカテゴリ @json が追加されました。他の既存の Valkey または Redis OSS コマンドは @json カテゴリのメンバーではありません。すべてのJSONコマンドは、キースペースまたはコマンドの制限とアクセス許可を適用します。
新しいJSONコマンドを含むように更新される既存の Valkey および Redis OSSACLカテゴリは、@read、@write、@fast、@slow、@admin の 5 つです。次の表は、適切なカテゴリへのJSONコマンドのマッピングを示しています。
JSON コマンド | @read | @write | @fast | @slow | @admin |
---|---|---|---|---|---|
JSON.ARRAPPEND |
y |
y |
|||
JSON.ARRINDEX |
y |
y |
|||
JSON.ARRINSERT |
y |
y |
|||
JSON.ARRLEN |
y |
y |
|||
JSON.ARRPOP |
y |
y |
|||
JSON.ARRTRIM |
y |
y |
|||
JSON.CLEAR |
y |
y |
|||
JSON.DEBUG |
y |
y |
y |
||
JSON.DEL |
y |
y |
|||
JSON.FORGET |
y |
y |
|||
JSON.GET |
y |
y |
|||
JSON.MGET |
y |
y |
|||
JSON.NUMINCRBY |
y |
y |
|||
JSON.NUMMULTBY |
y |
y |
|||
JSON.OBJKEYS |
y |
y |
|||
JSON.OBJLEN |
y |
y |
|||
JSON.RESP |
y |
y |
|||
JSON.SET |
y |
y |
|||
JSON.STRAPPEND |
y |
y |
|||
JSON.STRLEN |
y |
y |
|||
JSON.STRLEN |
y |
y |
|||
JSON.TOGGLE |
y |
y |
|||
JSON.TYPE |
y |
y |
|||
JSON.NUMINCRBY |
y |
y |
ネスト深度の制限
JSON オブジェクトまたは配列に、それ自体が別のJSONオブジェクトまたは配列である要素がある場合、その内部オブジェクトまたは配列は、外部オブジェクトまたは配列内に「ネスト」と呼ばれています。ネストの最大深度の制限は 128 です。128 より大きいネスト深度を含むドキュメントを作成しようとすると、エラーで拒否されます。
コマンド構文
ほとんどのコマンドでは、最初の引数としてキー名が必要です。一部のコマンドにはパス引数もあります。パス引数は、オプションで提供されない場合、デフォルトでルートになります。
表記法:
必須引数は山括弧で囲みます。例: <key>
オプションの引数は角括弧で囲みます。例: [path]
追加のオプション引数は省略記号 (「…」) で示されます。例: [json ...]
パス構文
Redis は 2 種類のパス構文JSONをサポートしています。
拡張構文 – 次の表に示すように、Goessner
で説明されているJSONPath構文に従います。わかりやすくするために、表の説明を並べ替え、一部変更しています。 制限構文 — クエリ機能が制限されます。
注記
一部のコマンドの結果は、使用されるパス構文のタイプの影響を受けます。
クエリパスが「$」で始まる場合は、拡張構文が使用されます。その他の場合は、制限構文が使用されます。
拡張構文
記号/式 | 説明 |
---|---|
$ |
ルート要素。 |
. または [] |
子演算子。 |
.. |
再帰下降。 |
* |
ワイルドカード。オブジェクトまたは配列のすべての要素。 |
[] |
配列の添字演算子。インデックスは 0 ベースです。 |
[,] |
union 演算子。 |
[start:end:step] |
配列のスライス演算子。 |
?() |
フィルタ (スクリプト) 式を現在の配列またはオブジェクトに適用します。 |
() |
フィルタ式。 |
@ |
処理中の現在のノードを参照するフィルタ式で使用されます。 |
== |
等しい。フィルタ式で使用されます。 |
!= |
等しくない。フィルタ式で使用されます。 |
> |
より大きい。フィルタ式で使用されます。 |
>= |
以上。フィルタ式で使用されます。 |
< |
より小さい。フィルタ式で使用されます。 |
<= |
以下。フィルタ式で使用されます。 |
&& |
論理 AND。複数のフィルター式を組み合わせるために使用されます。 |
|| |
論理 OR。複数のフィルタ式を組み合わせるために使用されます。 |
例
次の例は、Goessner
{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95, "in-stock": true, "sold": true }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99, "in-stock": false, "sold": true }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99, "in-stock": true, "sold": false }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99, "in-stock": false, "sold": false } ], "bicycle": { "color": "red", "price": 19.95, "in-stock": true, "sold": false } } }
パス | 説明 |
---|---|
$.store.book[*].author |
この店のすべての本の著者です。 |
$..author |
すべての著者です。 |
$.store.* |
店のすべてのメンバー。 |
$["store"].* |
店のすべてのメンバー。 |
$.store..price |
店のすべてのものの価格です。 |
$..* |
JSON 構造のすべての再帰メンバー。 |
$..book[*] |
すべての本です。 |
$..book[0] |
最初の本です。 |
$..book[-1] |
最後の本です。 |
$..book[0:2] |
最初の 2 冊の本です。 |
$..book[0,1] |
最初の 2 冊の本です。 |
$..book[0:4] |
インデックス 0 から 3 までの本です (終了インデックスは含みません)。 |
$..book[0:4:2] |
インデックス 0, 2 の本です。 |
$..book[?(@.isbn)] |
ISBN 番号を持つすべての本。 |
$..book[?(@.price<10)] |
10 ドルより安いすべての本。 |
'$..book[?(@.price < 10)]' |
10 ドルより安いすべての本です。(パスに空白が含まれている場合は、引用符で囲む必要があります。) |
'$..book[?(@["price"]< 10)]' |
10 ドルより安いすべての本。 |
'$..book[?(@.["price"]< 10)]' |
10 ドルより安いすべての本。 |
$..book[?(@.price>=10&&@.price<=100)] |
10 ドルから 100 ドルの価格帯 (この値を含む) にあるすべての本です。 |
'$..book[?(@.price>=10 && @.price<=100)]' |
10 ドルから 100 ドルの価格帯 (この値を含む) にあるすべての本です。(パスに空白が含まれている場合は、引用符で囲む必要があります。) |
$..book[?(@.sold==true||@.in-stock==false)] |
すべての本が売れたか、在庫切れです。 |
'$..book[?(@.sold == true || @.in-stock == false)]' |
すべての本が売れたか、在庫切れです。(パスに空白が含まれている場合は、引用符で囲む必要があります。) |
'$.store.book[?(@.["category"] == "fiction")]' |
フィクションのカテゴリのすべての本です。 |
'$.store.book[?(@.["category"] != "fiction")]' |
ノンフィクションのカテゴリのすべての本です。 |
追加のフィルタ式の例:
127.0.0.1:6379> JSON.SET k1 . '{"books": [{"price":5,"sold":true,"in-stock":true,"title":"foo"}, {"price":15,"sold":false,"title":"abc"}]}' OK 127.0.0.1:6379> JSON.GET k1 $.books[?(@.price>1&&@.price<20&&@.in-stock)] "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.price>1 && @.price<20 && @.in-stock)]' "[{\"price\":5,\"sold\":true,\"in-stock\":true,\"title\":\"foo\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?((@.price>1 && @.price<20) && (@.sold==false))]' "[{\"price\":15,\"sold\":false,\"title\":\"abc\"}]" 127.0.0.1:6379> JSON.GET k1 '$.books[?(@.title == "abc")]' [{"price":15,"sold":false,"title":"abc"}] 127.0.0.1:6379> JSON.SET k2 . '[1,2,3,4,5]' 127.0.0.1:6379> JSON.GET k2 $.*.[?(@>2)] "[3,4,5]" 127.0.0.1:6379> JSON.GET k2 '$.*.[?(@ > 2)]' "[3,4,5]" 127.0.0.1:6379> JSON.SET k3 . '[true,false,true,false,null,1,2,3,4]' OK 127.0.0.1:6379> JSON.GET k3 $.*.[?(@==true)] "[true,true]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ == true)]' "[true,true]" 127.0.0.1:6379> JSON.GET k3 $.*.[?(@>1)] "[2,3,4]" 127.0.0.1:6379> JSON.GET k3 '$.*.[?(@ > 1)]' "[2,3,4]"
制限構文
記号/式 | 説明 |
---|---|
. または [] |
子演算子。 |
[] |
配列の添字演算子。インデックスは 0 ベースです。 |
例
パス | 説明 |
---|---|
.store.book[0].author |
最初の本の著者です。 |
.store.book[-1].author |
最後の本の著者です。 |
.address.city |
都市名です。 |
["store"]["book"][0]["title"] |
最初の本のタイトルです。 |
["store"]["book"][-1]["title"] |
最後の本のタイトルです。 |
注記
このドキュメントで引用されているすべての Goessner
一般的なエラープレフィックス
各エラーメッセージにはプレフィックスが付いています。以下は、一般的なエラープレフィックスのリストです。。
Prefix | 説明 |
---|---|
ERR |
一般的なエラーです。 |
LIMIT |
サイズ制限を超えたときに発生するエラーです。例えば、ドキュメントのサイズ制限やネストの深度制限を超えた場合などです。 |
NONEXISTENT |
キーまたはパスが存在しません。 |
OUTOFBOUNDARIES |
配列インデックスが範囲外です。 |
SYNTAXERR |
構文エラーです。 |
WRONGTYPE |
値のタイプが間違っています。 |
JSON関連のメトリクス
以下のJSON情報メトリクスが提供されます。
情報 | 説明 |
---|---|
json_total_memory_bytes |
JSON オブジェクトに割り当てられた合計メモリ。 |
json_num_documents |
Valkey または Redis のドキュメントの合計数OSS。 |
コアメトリクスをクエリするには、以下のコマンドを実行します。
info json_core_metrics
ElastiCache for Valkey と Redis が とOSSやり取りする方法 JSON
次のセクションでは ElastiCache 、 for Valkey と Redis が JSON データ型とOSSやり取りする方法について説明します。
演算子の優先順位
フィルタリングの条件式を評価するときは、ほとんどの言語と同様に、&& が最も優先され、次に || が評価されます。括弧内の操作が最初に実行されます。
最大パスネスト制限の動作
Redis ElastiCache の の最大パスネスト制限OSSは 128 です。したがって、$.a.b.c.d...
のような値は 128 レベルまでしか到達できません。
数値の処理
JSON には、整数と浮動小数点数の個別のデータ型はありません。それらはすべて数値と呼ばれます。
数値表現:
入力時にJSON数値を受信すると、64 ビット符号付き整数または 64 ビットIEEE倍精度浮動小数点の 2 つの内部バイナリ表現のいずれかに変換されます。元の文字列、およびそのすべての書式は保持されません。したがって、数値がJSONレスポンスの一部として出力されると、内部バイナリ表現から汎用フォーマットルールを使用する印刷可能な文字列に変換されます。これらのルールにより、受信した文字列とは異なる文字列が生成される場合があります。
算術コマンド NUMINCRBY
および NUMMULTBY
:
両方の数値が整数で、結果が の範囲外である場合
int64
、自動的に 64 ビットのIEEE倍精度浮動小数点数になります。少なくとも 1 つの数値が浮動小数点の場合、結果は 64 ビットのIEEE倍精度浮動小数点数になります。
結果が 64 ビット double の範囲を超えるとIEEE、コマンドは
OVERFLOW
エラーを返します。
利用可能なコマンドの詳細なリストについては、「サポートされている Valkey コマンドと Redis OSS コマンド」を参照してください。
直接配列フィルタリング
ElastiCache for Valkey または Redis は、配列オブジェクトを直接OSSフィルタリングします。
のようなデータ[0,1,2,3,4,5,6]
、 のようなパスクエリ$[?(@<4)]
、または のようなデータ{"my_key":[0,1,2,3,4,5,6]}
、 のようなパスクエリの場合$.my_key[?(@<4)]
、 ElastiCache は両方の状況で [1,2,3] を返します。
配列インデックス作成の動作
ElastiCache Valkey または Redis では、配列の正と負の両方のインデックスOSSを使用できます。長さ 5 の配列の場合、0 で最初の要素を照会し、1 で 2 番目の要素を照会する、という順序になります。負の数は配列の最後から始まるので、-1 は 5 番目の要素を照会し、-2 は 4 番目の要素を照会し、以下同様に続きます。
お客様にとって予測可能な動作を確保するために、 ElastiCache は配列インデックスを四捨五入しません。したがって、長さが 5 の配列がある場合、インデックスを 5 以上、または -6 以下に呼び出しても結果は生成されません。
厳密な構文評価
MemoryDB は、JSONパスのサブセットに有効なパスが含まれている場合でも、無効な構文のパスを許可しません。これは、お客様のために正しい動作を維持することを目的とした処置です。