Redis OSS JSON データ型の概要 - Amazon ElastiCache (Redis OSS)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Redis OSS JSON データ型の概要

ElastiCache (Redis OSS) は、JSON データ型を操作するために多数の Redis OSS コマンドをサポートしています。以下は、JSON データ型の概要と、サポートされている Redis OSS コマンドの詳細なリストです。

用語

言葉 説明

JSON ドキュメント

Redis OSS JSON キーの値を指します。

JSON 値

ドキュメント全体を表すルートを含む、JSON ドキュメントのサブセットです。値は、コンテナまたはコンテナ内のエントリにすることができます。

JSON 要素

JSON 値と同じです。

サポートされている JSON 標準

JSON 形式は、RFC 7159 および ECMA-404 JSON データ交換標準に準拠しています。JSON テキストの UTF-8 Unicode がサポートされています。

ルート要素

ルート要素は任意の JSON データ型にすることができます。以前の RFC 4627 では、オブジェクトまたは配列のみがルート値として許可されていたことに注意してください。RFC 7159 への更新以降、JSON ドキュメントのルートは任意の JSON データ型にすることができます。

ドキュメントサイズの制限

JSON ドキュメントは、迅速なアクセスおよび変更のために最適化された形式で内部的に格納されます。通常、この形式では、同じドキュメントのシリアル化された同等の表現よりもいくらか多くのメモリを消費することになります。

単一の JSON ドキュメントによるメモリ消費量は 64 MB に制限されています。これは JSON 文字列ではなく、インメモリデータ構造のサイズです。JSON.DEBUG MEMORY コマンドを使用すれば、JSON ドキュメントが消費するメモリの量を確認できます。

JSON ACLs

  • JSON コマンドおよびデータへのアクセスを簡単に管理するために、既存のデータ型ごとのカテゴリ (@string、@hash など) と同様の新しいカテゴリ @json が追加されました。他の既存の Redis OSS コマンドは @json カテゴリのメンバーではありません。すべての JSON コマンドは、キースペースまたはコマンドの制限と権限を強制します。

  • 新しい JSON コマンドを含むように更新される既存の Redis OSS ACL カテゴリは、@read、@write、@fast、@slow、@admin の 5 つです。以下の表は、適切なカテゴリへの JSON コマンドのマッピングを示しています。

ACL
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 より大きいネスト深度を含むドキュメントを作成しようとすると、エラーで拒否されます。

コマンド構文

ほとんどのコマンドでは、最初の引数として Redis OSS キー名が必要です。一部のコマンドにはパス引数もあります。パス引数は、オプションで提供されない場合、デフォルトでルートになります。

表記法:

  • 必須引数は山括弧で囲みます。例: <key>

  • オプションの引数は角括弧で囲みます。例: [path]

  • 追加のオプション引数は省略記号 (「…」) で示されます。例: [json ...]

パス構文

Redis JSON では、次の 2 種類のパス構文をサポートしています。

  • 拡張構文 – 以下の表に示すように、Goessner で説明されている JSONPath 構文に従います。わかりやすくするために、表の説明を並べ替え、一部変更しています。

  • 制限構文 — クエリ機能が制限されます。

注記

一部のコマンドの結果は、使用されるパス構文のタイプの影響を受けます。

クエリパスが「$」で始まる場合は、拡張構文が使用されます。その他の場合は、制限構文が使用されます。

拡張構文

記号/式 説明

$

ルート要素。

. または []

子演算子。

..

再帰下降。

*

ワイルドカード。オブジェクトまたは配列のすべての要素。

[]

配列の添字演算子。インデックスは 0 ベースです。

[,]

union 演算子。

[start:end:step]

配列のスライス演算子。

?()

フィルタ (スクリプト) 式を現在の配列またはオブジェクトに適用します。

()

フィルタ式。

@

処理中の現在のノードを参照するフィルタ式で使用されます。

==

等しい。フィルタ式で使用されます。

!=

等しくない。フィルタ式で使用されます。

>

より大きい。フィルタ式で使用されます。

>=

以上。フィルタ式で使用されます。

<

より小さい。フィルタ式で使用されます。

<=

以下。フィルタ式で使用されます。

&&

論理 AND。複数のフィルタ式を組み合わせるために使用されます。

||

論理 OR。複数のフィルタ式を組み合わせるために使用されます。

以下の例は、Goessner のサンプル XML データに基づいて構築されています。フィールドを追加して一部変更しました。

{ "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 コンテンツには、クリエイティブコモンズライセンスが適用されます。

一般的なエラープレフィックス

各エラーメッセージにはプレフィックスが付いています。以下は、一般的なエラープレフィックスのリストです。。

プレフィックス 説明

ERR

一般的なエラーです。

LIMIT

サイズ制限を超えたときに発生するエラーです。例えば、ドキュメントのサイズ制限やネストの深度制限を超えた場合などです。

NONEXISTENT

キーまたはパスが存在しません。

OUTOFBOUNDARIES

配列インデックスが範囲外です。

SYNTAXERR

構文エラーです。

WRONGTYPE

値のタイプが間違っています。

JSON 関連メトリクス

以下の JSON 情報メトリクスが提供されます。

情報 説明

json_total_memory_bytes

JSON オブジェクトに割り当てられたメモリの合計です。

json_num_documents

Redis OSS 内のドキュメントの総数。

コアメトリクスをクエリするには、次の Redis OSS コマンドを実行します。

info json_core_metrics

ElastiCache (Redis OSS) が JSON とやり取りする方法

次のセクションでは、 ElastiCache (Redis OSS) が JSON データ型とやり取りする方法について説明します。

演算子の優先順位

フィルタリングの条件式を評価するときは、ほとんどの言語と同様に、&& が最も優先され、次に || が評価されます。括弧内の操作が最初に実行されます。

最大パスネスト制限の動作

ElastiCache (Redis OSS) の最大パスネスト制限は 128 です。したがって、$.a.b.c.d... のような値は 128 レベルまでしか到達できません。

数値の処理

JSON では、整数と浮動小数点数で異なるデータ型を使用しません。それらはすべて数値と呼ばれます。

数値表現:

入力で JSON 数値を受け取ると、次の 2 つの内部バイナリ表現のいずれかに変換されます: 64 ビット符号付き整数、または 64 ビット IEEE 倍精度浮動小数点数。元の文字列、およびそのすべての書式は保持されません。そのため、数値が JSON 応答の一部として出力されるときに、内部のバイナリ表現が、一般的な書式ルールが使用された印刷可能文字列に変換されます。これらのルールにより、受信した文字列とは異なる文字列が生成される場合があります。

算術コマンド NUMINCRBY および NUMMULTBY:

  • 両方の数値が整数で、結果が int64 の範囲外である場合は、自動的に 64 ビット IEEE 倍精度浮動小数点数になります。

  • 数字の少なくとも 1 つが浮動小数点の場合、結果は 64 ビット IEEE 倍精度浮動小数点数になります。

  • 結果が 64 ビット IEEE 倍精度の範囲を超える場合は、OVERFLOW エラーが返されます。

利用可能なコマンドの詳細なリストについては、「サポートされている Redis OSS JSON コマンド」を参照してください。

直接配列フィルタリング

ElastiCache (Redis OSS) は配列オブジェクトを直接フィルタリングします。

のようなデータ[0,1,2,3,4,5,6]、 のようなパスクエリ$[?(@<4)]、 のようなデータ、 {"my_key":[0,1,2,3,4,5,6]} のようなパスクエリの場合$.my_key[?(@<4)]、 ElastiCache (Redis OSS) は両方の状況で [1,2,3] を返します。

配列インデックス作成の動作

ElastiCache (Redis OSS) では、配列の正と負の両方のインデックスを使用できます。長さ 5 の配列の場合、0 で最初の要素を照会し、1 で 2 番目の要素を照会する、という順序になります。負の数は配列の最後から始まるので、-1 は 5 番目の要素を照会し、-2 は 4 番目の要素を照会し、以下同様に続きます。

顧客の予測可能な動作を確保するために、 ElastiCache (Redis OSS) は配列インデックスを四捨五入または切り上げないため、長さが 5 の配列がある場合、インデックス 5 以上、または -6 以下を呼び出しても結果は生成されません。

厳密な構文評価

MemoryDB では、パスのサブセットに有効なパスが含まれていても、無効な構文の JSON パスは許可されません。これは、お客様のために正しい動作を維持することを目的とした処置です。