

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

# JSON データ型の概要
<a name="json-document-overview"></a>

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

## 用語
<a name="json-terminology"></a>


****  

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

## サポートされている JSON 標準
<a name="Supported-JSON-Standard"></a>

JSON 形式は、[RFC 7159](https://www.ietf.org/rfc/rfc7159.txt) および [ECMA-404](https://www.ietf.org/rfc/rfc7159.txt) JSON データ交換標準に準拠しています。JSON テキストの UTF-8 [Unicode](https://www.unicode.org/standard/WhatIsUnicode.html) がサポートされています。

## ルート要素
<a name="json-root-element"></a>

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

## ドキュメントサイズの制限
<a name="json-document-size-limit"></a>

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

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

## JSON ACLs
<a name="json-acls"></a>
+ JSON コマンドおよびデータへのアクセスを簡単に管理するために、既存のデータ型ごとのカテゴリ (@string、@hash など) と同様の新しいカテゴリ @json が追加されました。他の既存の Valkey または Redis OSS コマンドは @json カテゴリのメンバーではありません。すべての JSON コマンドは、キースペースまたはコマンドの制限と権限を強制します。
+ 次の 5 つの既存の Valkey および Redis OSS ACL カテゴリが、新しい JSON コマンドを含むように更新されています: @read、@write、@fast、@slow、@admin。以下の表は、適切なカテゴリへの 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 |  |  | 

## ネスト深度の制限
<a name="json-nesting-depth-limit"></a>

JSON オブジェクトまたは配列に、それ自体が別の JSON オブジェクトまたは配列である要素がある場合、その内部オブジェクトまたは配列は外部オブジェクトまたは配列内で「ネスト」と呼ばれます。ネストの最大深度の制限は 128 です。128 より大きいネスト深度を含むドキュメントを作成しようとすると、エラーで拒否されます。

## コマンド構文
<a name="json-command-syntax"></a>

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

 表記法:
+ 必須引数は山括弧で囲みます。例: <key>
+ オプションの引数は角括弧で囲みます。例: [path]
+ 追加のオプション引数は省略記号 (「…」) で示されます。例: [json ...]

## パス構文
<a name="json-path-syntax"></a>

Redis JSON では、次の 2 種類のパス構文をサポートしています。
+ **拡張構文** – 以下の表に示すように、[Goessner](https://goessner.net/articles/JsonPath/) で説明されている JSONPath 構文に従います。わかりやすくするために、表の説明を並べ替え、一部変更しています。
+ **制限構文** — クエリ機能が制限されます。

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

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

**拡張構文**


****  

| 記号/式 | 説明 | 
| --- | --- | 
|  \$1 | ルート要素。 | 
|  . または [] | 子演算子。 | 
|  .. | 再帰下降。 | 
|  \$1 | ワイルドカード。オブジェクトまたは配列のすべての要素。 | 
|  [] | 配列の添字演算子。インデックスは 0 ベースです。 | 
|  [,] | union 演算子。 | 
|  [start:end:step] | 配列のスライス演算子。 | 
|  ?() | フィルタ (スクリプト) 式を現在の配列またはオブジェクトに適用します。 | 
|  () | フィルタ式。 | 
|  @ | 処理中の現在のノードを参照するフィルタ式で使用されます。 | 
|  == | 等しい。フィルタ式で使用されます。 | 
|  \$1= | 等しくない。フィルタ式で使用されます。 | 
|  > | より大きい。フィルタ式で使用されます。 | 
|  >= | 以上。フィルタ式で使用されます。 | 
|  < | より小さい。フィルタ式で使用されます。 | 
|  <= | 以下。フィルタ式で使用されます。 | 
|  && | 論理 AND。複数のフィルタ式を組み合わせるために使用されます。 | 
|  \$1\$1 | 論理 OR。複数のフィルタ式を組み合わせるために使用されます。 | 

**例**

以下の例は、[Goessner](https://goessner.net/articles/JsonPath/) のサンプル 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
    }
  }
}
```


****  

| パス | 説明 | 
| --- | --- | 
|  \$1.store.book[\$1].author | この店のすべての本の著者です。 | 
|  \$1..author | すべての著者です。 | 
|  \$1.store.\$1 | 店のすべてのメンバー。 | 
|  \$1["store"].\$1 | 店のすべてのメンバー。 | 
|  \$1.store..price | 店のすべてのものの価格です。 | 
|  \$1..\$1 | JSON 構造のすべての再帰的メンバーです。 | 
|  \$1..book[\$1] | すべての本です。 | 
|  \$1..book[0] | 最初の本です。 | 
|  \$1..book[-1] | 最後の本です。 | 
|  \$1..book[0:2] | 最初の 2 冊の本です。 | 
|  \$1..book[0,1] | 最初の 2 冊の本です。 | 
|  \$1..book[0:4] | インデックス 0 から 3 までの本です (終了インデックスは含みません)。 | 
|  \$1..book[0:4:2] | インデックス 0, 2 の本です。 | 
|  \$1..book[?(@.isbn)] | ISBN 番号があるすべての本です。 | 
|  \$1..book[?(@.price<10)] | 10 ドルより安いすべての本。 | 
|  '\$1..book[?(@.price < 10)]' | 10 ドルより安いすべての本です。(パスに空白が含まれている場合は、引用符で囲む必要があります。) | 
|  '\$1..book[?(@["price"]< 10)]' | 10 ドルより安いすべての本。 | 
|  '\$1..book[?(@.["price"]< 10)]' | 10 ドルより安いすべての本。 | 
|  \$1..book[?(@.price>=10&&@.price<=100)] | 10 ドルから 100 ドルの価格帯 (この値を含む) にあるすべての本です。 | 
|  '\$1..book[?(@.price>=10 && @.price<=100)]' | 10 ドルから 100 ドルの価格帯 (この値を含む) にあるすべての本です。(パスに空白が含まれている場合は、引用符で囲む必要があります。) | 
|  \$1..book[?(@.sold==true\$1\$1@.in-stock==false)] | すべての本が売れたか、在庫切れです。 | 
|  '\$1..book[?(@.sold == true \$1\$1 @.in-stock == false)]' | すべての本が売れたか、在庫切れです。(パスに空白が含まれている場合は、引用符で囲む必要があります。) | 
|  '\$1.store.book[?(@.["category"] == "fiction")]' | フィクションのカテゴリのすべての本です。 | 
|  '\$1.store.book[?(@.["category"] \$1= "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](https://goessner.net/articles/JsonPath/) コンテンツには、[クリエイティブコモンズライセンス](https://creativecommons.org/licenses/by/2.5/)が適用されます。

## 一般的なエラープレフィックス
<a name="json-error-prefixes"></a>

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


****  

| プレフィックス | 説明 | 
| --- | --- | 
|  ERR | 一般的なエラーです。 | 
|  制限 | サイズ制限を超えたときに発生するエラーです。例えば、ドキュメントのサイズ制限やネストの深度制限を超えた場合などです。 | 
|  NONEXISTENT | キーまたはパスが存在しません。 | 
|  OUTOFBOUNDARIES | 配列インデックスが範囲外です。 | 
|  SYNTAXERR | 構文エラーです。 | 
|  WRONGTYPE | 値のタイプが間違っています。 | 

## JSON 関連メトリクス
<a name="json-info-metrics"></a>

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


****  

| Info | 説明 | 
| --- | --- | 
|  json\$1total\$1memory\$1bytes | JSON オブジェクトに割り当てられたメモリの合計です。 | 
|  json\$1num\$1documents | Valkey または Redis OSS 内のドキュメントの総数です。 | 

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

```
info json_core_metrics
```

## ElastiCache for Valkey および ElastiCache for Redis OSS と JSON との連携方法
<a name="json-differences"></a>

以下のセクションでは、ElastiCache for Valkey および ElastiCache for Redis OSS と JSON データ型との連携方法について説明します。

### 演算子の優先順位
<a name="json-operator-precedence"></a>

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

### 最大パスネスト制限の動作
<a name="json-max-path"></a>

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

### 数値の処理
<a name="json-about-numbers"></a>

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

数値表現:

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

算術コマンド `NUMINCRBY` および `NUMMULTBY`:
+ 両方の数値が整数で、結果が `int64` の範囲外である場合は、自動的に 64 ビット IEEE 倍精度浮動小数点数になります。
+ 数字の少なくとも 1 つが浮動小数点の場合、結果は 64 ビット IEEE 倍精度浮動小数点数になります。
+ 結果が 64 ビット IEEE 倍精度の範囲を超える場合は、`OVERFLOW` エラーが返されます。

利用可能なコマンドの詳細なリストについては、「[サポートされている Valkey および Redis OSS のコマンドJSON コマンド](json-list-commands.md)」を参照してください。

### 直接配列フィルタリング
<a name="json-direct-array-filtering"></a>

ElastiCache for Valkey または ElastiCache for 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] を返します。

### 配列インデックス作成の動作
<a name="json-direct-array-indexing"></a>

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

お客様の予測可能な動作を保証するために、ElastiCache では配列インデックスの切り捨て/切り上げを行いません。したがって、長さ 5 の配列がある場合、インデックス 5 以上、または -6 以下を呼び出しても結果は生成されません。

### 厳密な構文評価
<a name="json-strict-syntax-evaluation"></a>

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