

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

# JSON の使用開始
<a name="json-gs"></a>

MemoryDB は、Valkey または Redis OSS クラスター内の複雑なデータセットをエンコードするためのシンプルでスキーマレスな方法である JavaScript Object Notation (JSON) をサポートしています。クラスター内で JavaScript Object Notation (JSON) 形式を使用してデータをネイティブに保存およびアクセスし、それらのクラスターに保存されている JSON データを更新できます。カスタムコードを管理してシリアル化および逆シリアル化する必要はありません。

JSON 上で動作するアプリケーションに Valkey または Redis OSS API を使用することに加えて、オブジェクト全体を操作することなく、JSON ドキュメントの特定の部分を効率的に取得および更新できるようになりました。これによってパフォーマンスの向上とコストの削減が可能になります。また、[Goessner-style](https://goessner.net/articles/JsonPath/) `JSONPath` クエリを使用して、JSON ドキュメントの内容を検索することもできます。

サポートされているエンジンバージョンでクラスターを作成すると、JSON データタイプおよび関連するコマンドが自動的に使用可能になります。これは、RedisJSON モジュールのバージョン 2 と互換性のある API および RDB であるため、既存の JSON ベースの Valkey または Redis OSS アプリケーションを MemoryDB に簡単に移行できます。サポートされているコマンドの詳細については、「[サポートされているコマンド](json-list-commands.md)」を参照してください。

JSON 関連のメトリクス `JsonBasedCmds` および は、このデータタイプの使用状況をモニタリングするために CloudWatch に組み込まれています。詳細については、「[‬Metrics for MemoryDB‭](https://docs.aws.amazon.com/memorydb/latest/devguide/metrics.memorydb.html)」を参照してください。

**注記**  
JSON を使用するには、Valkey 7.2 以降、Redis OSS エンジンバージョン 6.2.6 以降を実行している必要があります。

**Topics**
+ [JSON データ型の概要](json-document-overview.md)
+ [サポートされているコマンド](json-list-commands.md)

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

MemoryDB では、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 データ型は、Valkey および Redis OSS ‭[アクセスコントロールリスト (ACL)‭](https://valkey.io/topics/acl/)‬ 機能に完全に統合されています。JSON コマンドおよびデータへのアクセスを簡単に管理するために、既存のデータ型ごとのカテゴリ (@string、@hash など) と同様の新しいカテゴリ @json が追加されました。他の既存の Valkey および Redis OSS コマンドは @json カテゴリのメンバーではありません。すべての JSON コマンドは、キースペースまたはコマンドの制限と権限を強制します。
+ 次の 5 つの既存の 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>

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

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

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

Valkey または Redis OSS の 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..book0 | 最初の本です | 
|  \$1..book-1 | 最後の本です | 
|  \$1..book0:2 | 最初の 2 冊の本です | 
|  \$1..book0,1 | 最初の 2 冊の本です | 
|  \$1..book0:4 | インデックス 0 から 3 までの本です (終了インデックスは含みません) | 
|  \$1..book0: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.book0.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>

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


****  

| Prefix | 説明 | 
| --- | --- | 
|  ERR | 一般的なエラーです | 
|  LIMIT | サイズ制限超過エラー。例:ドキュメントのサイズ制限やネストの深さの制限を超えた | 
|  NONEXISTENT | キーまたはパスが存在しません | 
|  OUTOFBOUNDARIES | 配列インデックスが範囲外です | 
|  SYNTAXERR | 構文エラー | 
|  WRONGTYPE | 値のタイプが間違っています | 

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

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


****  

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

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

```
info json_core_metrics
```

## MemoryDB が JSON とどのように相互作用するか
<a name="json-differences"></a>

以下は、MemoryDB が JSON データ型とどのように相互作用するかを示しています。

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

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

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

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

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

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

JSON 番号を受信すると、2 つのフォーマットのいずれかで保存されます。数値が 64 ビットの符号付き整数に収まる場合は、その形式に変換されます。それ以外の場合は、文字列として格納されます。2 つの JSON 数値 (JSON.NUMINCRBY と JSON.NUMMULTBY など) に対する算術演算では、可能な限り精度を保つように努めています。2 つのオペランドと結果の値が 64 ビットの符号付き整数に収まる場合は、整数演算が実行されます。それ以外の場合は、入力オペランドが 64 ビット IEEE 倍精度浮動小数点数に変換され、算術演算が実行されて結果が文字列に変換されます。

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

**注記**  
Redis OSS エンジンバージョン 6.2.6.R2 以前では、JSON 数値を入力で受け取ると、64 ビット符号付き整数または 64 ビット IEEE 倍精度浮動小数点の 2 つの内部バイナリ表現のいずれかに変換されます。元の文字列、およびそのすべての書式は保持されません。そのため、数値が JSON 応答の一部として出力されるときに、内部のバイナリ表現が、一般的な書式ルールが使用された印刷可能文字列に変換されます。これらのルールにより、受信した文字列とは異なる文字列が生成される場合があります。  
両方の数値が整数で、結果が `int64` の範囲外である場合は、自動的に 64 ビット IEEE 倍精度浮動小数点数になります。
数字の少なくとも 1 つが浮動小数点の場合、結果は 64 ビット IEEE 倍精度浮動小数点数になります。
結果が 64 ビット IEEE 倍精度の範囲を超える場合は、`OVERFLOW` エラーが返されます。

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

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

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

# サポートされているコマンド
<a name="json-list-commands"></a>

以下の JSON コマンドがサポートされています:

**Topics**
+ [JSON.ARRAPPEND](json-arrappend.md)
+ [JSON.ARRINDEX](json-arrindex.md)
+ [JSON.ARRINSERT](json-arrinsert.md)
+ [JSON.ARRLEN](json-arrlen.md)
+ [JSON.ARRPOP](json-arrpop.md)
+ [JSON.ARRTRIM](json-arrtrim.md)
+ [JSON.CLEAR](json-clear.md)
+ [JSON.DEBUG](json-debug.md)
+ [JSON.DEL](json-del.md)
+ [JSON.FORGET](json-forget.md)
+ [JSON.GET](json-get.md)
+ [JSON.MGET](json-mget.md)
+ [JSON.NUMINCRBY](json-numincrby.md)
+ [JSON.NUMMULTBY](json-nummultby.md)
+ [JSON.OBJLEN](json-objlen.md)
+ [JSON.OBJKEYS](json-objkeys.md)
+ [JSON.RESP](json-resp.md)
+ [JSON.SET](json-set.md)
+ [JSON.STRAPPEND](json-strappend.md)
+ [JSON.STRLEN](json-strlen.md)
+ [JSON.TOGGLE](json-toggle.md)
+ [JSON.TYPE](json-type.md)

# JSON.ARRAPPEND
<a name="json-arrappend"></a>

パスの配列値に 1 つ以上の値を追加します。

構文

```
JSON.ARRAPPEND <key> <path> <json> [json ...]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ json (必須) - 配列に追加される JSON 値

**戻る**

パスが拡張構文の場合:
+ 各パスの配列の新しい長さを表す整数の配列。
+ 値が配列でない場合、対応する戻り値は null です。
+ 入力 json 引数のいずれかが有効な JSON 文字列でない場合は、`SYNTAXERR` エラーになります。
+ パスが存在しない場合は、`NONEXISTENT` エラーになります。

パスが制限構文の場合:
+ 整数、配列の新しい長さ。
+ 複数の配列値が選択されている場合、コマンドは最後に更新された配列の新しい長さを返します。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。
+ 入力 json 引数のいずれかが有効な JSON 文字列でない場合は、`SYNTAXERR` エラーになります。
+ パスが存在しない場合は、`NONEXISTENT` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 $[*] '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"a\",\"c\"],[\"a\",\"b\",\"c\"]]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRAPPEND  k1 [-1] '"c"'
(integer) 3
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"],[\"a\",\"b\",\"c\"]]"
```

# JSON.ARRINDEX
<a name="json-arrindex"></a>

パスの配列で最初に出現するスカラー JSON 値を検索します。
+ 範囲外のエラーは、インデックスを配列の開始と終了に丸めることによって処理されます。
+ start > end の場合は、-1 (見つからない) を返します。

構文

```
JSON.ARRINDEX <key> <path> <json-scalar> [start [end]]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ json-scalar (必須) — 検索するスカラー値。JSON スカラーはオブジェクトでも配列でもない値を指します。つまり、文字列、数値、ブール値、null はスカラー値となります。
+ 開始 「オプショナル」– 開始インデックス、インクルーシブ｡ 指定しない場合、デフォルトで 0 になります。
+ 終了「オプショナル」 – 終了インデックス、エクスクルーシブ。指定しない場合、デフォルトで 0 になります。したがって、最後の要素が含まれます。0 または -1 は、最後の要素が含まれることを意味します。

**戻る**

パスが拡張構文の場合:
+ 整数の配列。各値は、パスの配列の一致する要素のインデックスです。見つからない場合の値は -1 です。
+ 値が配列でない場合、対応する戻り値は null です。

パスが制限構文の場合:
+ 整数、一致する要素のインデックス。見つからない場合は -1。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 $[*] '"b"'
1) (integer) -1
2) (integer) -1
3) (integer) 1
4) (integer) 1
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRINDEX k1 .children '"Tom"'
(integer) 2
```

# JSON.ARRINSERT
<a name="json-arrinsert"></a>

そのインデックスの前のパスの配列値に 1 つ以上の値を挿入します。

構文

```
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ index (必須) – 値が挿入される前の配列インデックス。
+ json (必須) - 配列に追加される JSON 値

**戻る**

パスが拡張構文の場合:
+ 各パスの配列の新しい長さを表す整数の配列。
+ 値が空の配列の場合、対応する戻り値は null です。
+ 値が配列でない場合、対応する戻り値は null です。
+ index 引数が範囲外である場合は、`OUTOFBOUNDARIES` エラーになります。

パスが制限構文の場合:
+ 整数、配列の新しい長さ。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。
+ index 引数が範囲外である場合は、`OUTOFBOUNDARIES` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 $[*] 0 '"c"'
1) (integer) 1
2) (integer) 2
3) (integer) 3
127.0.0.1:6379> JSON.GET k1
"[[\"c\"],[\"c\",\"a\"],[\"c\",\"a\",\"b\"]]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRINSERT k1 . 0 '"c"'
(integer) 4
127.0.0.1:6379> JSON.GET k1
"[\"c\",[],[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRLEN
<a name="json-arrlen"></a>

パスの配列値の長さを取得します。

構文

```
JSON.ARRLEN <key> [path] 
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 各パスの配列の長さを表す整数の配列。
+ 値が配列でない場合、対応する戻り値は null です。
+ ドキュメントキーが存在しない場合は、null になります。

パスが制限構文の場合:
+ 一括文字列の配列。各要素はオブジェクトのキー名です。
+ 整数、配列の長さ。
+ 複数のオブジェクトが選択されている場合、このコマンドは最初の配列の長さを返します。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。
+ パスが存在しない場合は、`WRONGTYPE` エラーになります。
+ ドキュメントキーが存在しない場合は、null になります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], [\"a\"], [\"a\", \"b\"], [\"a\", \"b\", \"c\"]]'
(error) SYNTAXERR Failed to parse JSON string due to syntax error
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 $[*]
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 $[*]
1) (integer) 0
2) (nil)
3) (integer) 2
4) (integer) 3
5) (nil)
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRLEN k1 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k1 $[3]
1) (integer) 3

127.0.0.1:6379> JSON.SET k2 . '[[], "a", ["a", "b"], ["a", "b", "c"], 4]'
OK
127.0.0.1:6379> JSON.ARRLEN k2 [*]
(integer) 0
127.0.0.1:6379> JSON.ARRLEN k2 $[1]
1) (nil)
127.0.0.1:6379> JSON.ARRLEN k2 $[2]
1) (integer) 2
```

# JSON.ARRPOP
<a name="json-arrpop"></a>

配列からそのインデックスの要素を削除し、返します。空の配列をポップすると null が返されます。

構文

```
JSON.ARRPOP <key> [path [index]]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります
+ index (オプション) — ポップを開始する配列内の位置。
  + 指定しない場合、デフォルトで -1 になります。これは最後の要素を意味します。
  + 負の値は、最後の要素からの位置を意味します。
  + 境界外インデックスは、それぞれの配列境界に丸められます。

**戻る**

パスが拡張構文の場合:
+ 各パスのポップされた値を表す一括文字列の配列。
+ 値が空の配列の場合、対応する戻り値は null です。
+ 値が配列でない場合、対応する戻り値は null です。

パスが制限構文の場合:
+ 一括文字列。ポップされた JSON 値を表します
+ 配列が空の場合は null になります。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1 $[*]
1) (nil)
2) "\"a\""
3) "\"b\""
127.0.0.1:6379> JSON.GET k1
"[[],[],[\"a\"]]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k1
"[\"a\",\"b\"]"
127.0.0.1:6379> JSON.GET k1
"[[],[\"a\"]]"

127.0.0.1:6379> JSON.SET k2 . '[[], ["a"], ["a", "b"]]'
OK
127.0.0.1:6379> JSON.ARRPOP k2 . 0
"[]"
127.0.0.1:6379> JSON.GET k2
"[[\"a\"],[\"a\",\"b\"]]"
```

# JSON.ARRTRIM
<a name="json-arrtrim"></a>

部分配列 start, end となるようにパスの配列をトリムします (どちらもこの値を含みます)。
+ 配列が空の場合は、何もしないで 0 を返します。
+ start < 0 の場合は、0 として扱います。
+ end >= サイズ (配列のサイズ) の場合は、サイズ-1 として扱います。
+ start >= サイズまたは start > end の場合は、配列を空にして 0 を返します。

構文

```
JSON.ARRINSERT <key> <path> <start> <end>
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ 開始 (必須) — 開始インデックス (この値を含みます)｡
+ 終了 (必須) — 終了インデックス (この値を含みます)｡

**戻る**

パスが拡張構文の場合:
+ 各パスの配列の新しい長さを表す整数の配列。
+ 値が空の配列の場合、対応する戻り値は null です。
+ 値が配列でない場合、対応する戻り値は null です。
+ index 引数が範囲外である場合は、`OUTOFBOUNDARIES` エラーになります。

パスが制限構文の場合:
+ 整数、配列の新しい長さ。
+ 配列が空の場合は null になります。
+ パスの値が配列でない場合は、`WRONGTYPE` エラーになります。
+ index 引数が範囲外である場合は、`OUTOFBOUNDARIES` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[[], ["a"], ["a", "b"], ["a", "b", "c"]]'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 $[*] 0 1
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 2
   127.0.0.1:6379> JSON.GET k1
   "[[],[\"a\"],[\"a\",\"b\"],[\"a\",\"b\"]]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.ARRTRIM k1 .children 0 1
(integer) 2
127.0.0.1:6379> JSON.GET k1 .children
"[\"John\",\"Jack\"]"
```

# JSON.CLEAR
<a name="json-clear"></a>

パスの配列またはオブジェクトをクリアします。

構文

```
JSON.CLEAR <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**
+ 整数、クリアされたコンテナの数。
+ 空の配列またはオブジェクトをクリアすると、0 つのコンテナがクリアされます。
**注記**  
Redis OSS バージョン 6.2.6.R2 以前では、空の配列またはオブジェクトをクリアすると、1 つのコンテナがクリアされます。
+ コンテナ以外の値をクリアすると 0 が返されます。
+ パスに配列やオブジェクト値が見つからない場合、コマンドは 0 を返します。

**例**

```
127.0.0.1:6379> JSON.SET k1 . '[[], [0], [0,1], [0,1,2], 1, true, null, "d"]'
OK
127.0.0.1:6379>  JSON.CLEAR k1  $[*]
(integer) 6
127.0.0.1:6379> JSON.CLEAR k1  $[*]
(integer) 0
127.0.0.1:6379> JSON.SET k2 . '{"children": ["John", "Jack", "Tom", "Bob", "Mike"]}'
OK
127.0.0.1:6379> JSON.CLEAR k2 .children
(integer) 1
127.0.0.1:6379> JSON.GET k2 .children
"[]"
```

# JSON.DEBUG
<a name="json-debug"></a>

レポート情報。サポートされるサブコマンドは以下のとおりです。
+ MEMORY <key> [path] – メモリの使用状況を JSON 値のバイト数でレポートします。パスが指定されていない場合、デフォルトはルートになります。
+ DEPTH <key> [path] – JSON ドキュメントの最大パス深度を報告します。
**注記**  
このサブコマンドは、Valkey 7.2 以降または Redis OSS エンジンバージョン 6.2.6.R2 以降でのみ使用できます。
+ FIELDS <key> [path] – 指定されたドキュメントパスのフィールド数をレポートします。パスが指定されていない場合、デフォルトはルートになります。コンテナ以外の JSON 値はそれぞれ 1 つのフィールドとしてカウントされます。オブジェクトと配列は、それらを含む JSON 値ごとに 1 つのフィールドを再帰的にカウントします。ルートコンテナを除く各コンテナ値は、1 つの追加フィールドとしてカウントされます。
+ HELP – コマンドに関するヘルプメッセージを出力します。

構文

```
JSON.DEBUG <subcommand & arguments>
```

サブコマンドによって異なります。

MEMORY
+ パスが拡張構文の場合:
  + 各パスの JSON 値のフィールド数を表す整数の配列を返します。
  + キーが存在しない場合は、空の配列を返します。
+ パスが制限構文の場合:
  + 整数のメモリサイズ、および JSON 値 (バイト単位) を返します。
  + キーが存在しない場合は、null を返します。

DEPTH
+ JSON ドキュメントの最大パス深度を表す整数を返します。
+ キーが存在しない場合は、null を返します。

FIELDS
+ パスが拡張構文の場合:
  + 各パスにおける JSON 値のフィールド数を表す整数の配列を返します。
  + キーが存在しない場合は、空の配列を返します。
+ パスが制限構文の場合:
  + JSON 値のフィールド数を整数で返します。
  + キーが存在しない場合は、null を返します。

HELP - ヘルプメッセージの配列を返します。

**例**

拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, [], {"a":1, "b":2}, [1,2,3]]'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1 $[*]
1) (integer) 16
2) (integer) 16
3) (integer) 19
4) (integer) 16
5) (integer) 16
6) (integer) 16
7) (integer) 16
8) (integer) 50
9) (integer) 64
127.0.0.1:6379> JSON.DEBUG FIELDS k1 $[*]
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) (integer) 1
5) (integer) 1
6) (integer) 0
7) (integer) 0
8) (integer) 2
9) (integer) 3
```

制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.DEBUG MEMORY k1
(integer) 632
127.0.0.1:6379> JSON.DEBUG MEMORY k1 .phoneNumbers
(integer) 166

127.0.0.1:6379> JSON.DEBUG FIELDS k1
(integer) 19
127.0.0.1:6379> JSON.DEBUG FIELDS k1 .address
(integer) 4

127.0.0.1:6379> JSON.DEBUG HELP
1) JSON.DEBUG MEMORY <key> [path] - report memory size (bytes) of the JSON element. Path defaults to root if not provided.
2) JSON.DEBUG FIELDS <key> [path] - report number of fields in the JSON element. Path defaults to root if not provided.
3) JSON.DEBUG HELP - print help message.
```

# JSON.DEL
<a name="json-del"></a>

ドキュメントキーのパスにある JSON 値を削除します。パスがルートの場合、Valkey または Redis OSS からキーを削除することと同じです。

構文

```
JSON.DEL <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**
+ 削除された要素の数。
+ キーが存在しない場合は、0 になります。
+ JSON パスが無効であるか、存在しない場合は、0 になります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 $.d.*
(integer) 3
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 $.e[*]
(integer) 5
127.0.0.1:6379> JSOn.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.DEL k1 .d.*
(integer) 3
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.DEL k1 .e[*]
(integer) 5
127.0.0.1:6379> JSON.GET k1
"{\"a\":{},\"b\":{\"a\":1},\"c\":{\"a\":1,\"b\":2},\"d\":{},\"e\":[]}"
```

# JSON.FORGET
<a name="json-forget"></a>

[JSON.DEL](json-del.md) のエイリアス

# JSON.GET
<a name="json-get"></a>

1 つ以上のパスにあるシリアル化された JSON を返します。

構文

```
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE newline-string]
[SPACE space-string]
[NOESCAPE]
[path ...]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ INDENT/NEWLINE/SPACE (オプション) – 返される JSON 文字列の形式、すなわち「整形出力」を制御します。それぞれのデフォルト値は空の文字列です。任意の組み合わせでオーバーライドすることが可能です。これらは任意の順序で指定できます。
+ NOESCAPE - オプション。レガシーの互換性のために存在しており、他の効果はありません。
+ パス (オプション) – ゼロ以上の JSON パス。何も指定されていない場合は、デフォルトでルートになります。パス引数は末尾に置く必要があります。

**戻る**

拡張パス構文:

 パスが 1 つ指定されている場合:
+ 値の配列のシリアル化された文字列を返します。
+ 値が選択されなかった場合は、空の配列を返します。

 複数のパスが指定されている場合:
+ 各パスがキーである、文字列化された JSON オブジェクトを返します。
+ 拡張パス構文と制限パス構文が混在している場合、結果は拡張構文に準拠します。
+ パスが存在しない場合、対応する値は空の配列です。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 $.address.*
"[\"21 2nd Street\",\"New York\",\"NY\",\"10021-3100\"]"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" $.address.*
"[\n\t\"21 2nd Street\",\n\t\"New York\",\n\t\"NY\",\n\t\"10021-3100\"\n]"
127.0.0.1:6379> JSON.GET k1 $.firstName $.lastName $.age
"{\"$.firstName\":[\"John\"],\"$.lastName\":[\"Smith\"],\"$.age\":[27]}"            
127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}}'
OK
127.0.0.1:6379> json.get k2 $..*
"[{},{\"a\":1},{\"a\":1,\"b\":2},1,1,2]"
```

 制限パス構文:

```
 127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.GET k1 .address
"{\"street\":\"21 2nd Street\",\"city\":\"New York\",\"state\":\"NY\",\"zipcode\":\"10021-3100\"}"
127.0.0.1:6379> JSON.GET k1 indent "\t" space " " NEWLINE "\n" .address
"{\n\t\"street\": \"21 2nd Street\",\n\t\"city\": \"New York\",\n\t\"state\": \"NY\",\n\t\"zipcode\": \"10021-3100\"\n}"
127.0.0.1:6379> JSON.GET k1 .firstName .lastName .age
"{\".firstName\":\"John\",\".lastName\":\"Smith\",\".age\":27}"
```

# JSON.MGET
<a name="json-mget"></a>

複数のドキュメントキーからのパスでシリアル化された JSON を取得します。存在しないキーまたは JSON パスの場合は null を返します。

構文

```
JSON.MGET <key> [key ...] <path>
```
+ key (必須) - ドキュメントタイプの 1 つ以上のキー。
+ パス (必須) - JSON パス

**戻る**
+ 一括文字列の配列。配列のサイズは、コマンド内のキーの数と等しくなります。配列の各要素には、(a) パスによって配置されたシリアル化された JSON、または (b) キーが存在しない場合、パスがドキュメント内に存在しない場合、パスが無効な場合 (構文エラー) は null が入力されます。
+ 指定されたキーのいずれかが存在し、JSON キーではない場合、コマンドは `WRONGTYPE` エラーを返します。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK
127.0.0.1:6379> JSON.MGET k1 k2 k3 $.address.city
1) "[\"New York\"]"
2) "[\"Boston\"]"
3) "[\"Seattle\"]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021"}}'
OK
127.0.0.1:6379> JSON.SET k2 . '{"address":{"street":"5 main Street","city":"Boston","state":"MA","zipcode":"02101"}}'
OK
127.0.0.1:6379> JSON.SET k3 . '{"address":{"street":"100 Park Ave","city":"Seattle","state":"WA","zipcode":"98102"}}'
OK

127.0.0.1:6379> JSON.MGET k1 k2 k3 .address.city
1) "\"New York\""
2) "\"Seattle\""
3) "\"Seattle\""
```

# JSON.NUMINCRBY
<a name="json-numincrby"></a>

指定された数だけパスの数値を増分します。

構文

```
JSON.NUMINCRBY <key> <path> <number>
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ 番号 (必須) — 数値

**戻る**

パスが拡張構文の場合:
+ 各パスの結果値を表す一括文字列の配列。
+ 値が数値でない場合、対応する戻り値は null です。
+ 番号を解析できない場合は、`WRONGTYPE` エラーになります。
+ 結果が 64 ビット IEEE 倍精度の範囲外の場合は、`OVERFLOW` エラーになります。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。

パスが制限構文の場合:
+ 結果の値を表す一括文字列。
+ 複数の値を選択した場合、コマンドは最後に更新された値の結果を返します。
+ パスの値が数値でない場合は、`WRONGTYPE` エラーになります。
+ 番号を解析できない場合は、`WRONGTYPE` エラーになります。
+ 結果が 64 ビット IEEE 倍精度の範囲外の場合は、`OVERFLOW` エラーになります。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 10
"[11,12,13]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[11,12,13]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 $.a[*] 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.b[*] 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.c[*] 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k1 $.d[*] 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 $.a.* 1
"[]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.b.* 1
"[2]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.c.* 1
"[2,3]"
127.0.0.1:6379> JSON.NUMINCRBY k2 $.d.* 1
"[2,3,4]"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 $.a.* 1
"[null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.b.* 1
"[null,2]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.c.* 1
"[null,null]"
127.0.0.1:6379> JSON.NUMINCRBY k3 $.d.* 1
"[2,null,4]"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":4}}"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[1] 10
"12"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,12,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k1 .a[*] 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k1 .b[*] 1
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .c[*] 1
"3"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMINCRBY k1 .d[*] 1
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,3],\"d\":[2,3,4]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k2 .a.* 1
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMINCRBY k2 .b.* 1
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .c.* 1
"3"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMINCRBY k2 .d.* 1
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":3},\"d\":{\"a\":2,\"b\":3,\"c\":4}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMINCRBY k3 .a.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .b.* 1
"2"
127.0.0.1:6379> JSON.NUMINCRBY k3 .c.* 1
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMINCRBY k3 .d.* 1
"4"
```

# JSON.NUMMULTBY
<a name="json-nummultby"></a>

指定された数だけパスの数値を乗算します。

構文

```
JSON.NUMMULTBY <key> <path> <number>
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス
+ 番号 (必須) — 数値

**戻る**

パスが拡張構文の場合:
+ 各パスの結果値を表す一括文字列の配列。
+ 値が数値でない場合、対応する戻り値は null です。
+ 番号を解析できない場合は、`WRONGTYPE` エラーになります。
+ 結果が 64 ビット IEEE 倍精度の範囲外の場合は、`OVERFLOW` エラーになります。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。

パスが制限構文の場合:
+ 結果の値を表す一括文字列。
+ 複数の値を選択した場合、コマンドは最後に更新された値の結果を返します。
+ パスの値が数値でない場合は、`WRONGTYPE` エラーになります。
+ 番号を解析できない場合は、`WRONGTYPE` エラーになります。
+ 結果が 64 ビット IEEE 倍精度の範囲外の場合は、`OVERFLOW` エラーになります。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k1 $ '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 $.a[*] 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.b[*] 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.c[*] 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k1 $.d[*] 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k2 $ '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 $.a.* 2
"[]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.b.* 2
"[2]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.c.* 2
"[2,4]"
127.0.0.1:6379> JSON.NUMMULTBY k2 $.d.* 2
"[2,4,6]"

127.0.0.1:6379> JSON.SET k3 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 $.a.* 2
"[null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.b.* 2
"[null,2]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.c.* 2
"[null,null]"
127.0.0.1:6379> JSON.NUMMULTBY k3 $.d.* 2
"[2,null,6]"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[1] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[1],\"c\":[1,2],\"d\":[1,4,3]}"

127.0.0.1:6379> JSON.SET k1 . '{"a":[], "b":[1], "c":[1,2], "d":[1,2,3]}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k1 .a[*] 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k1 .b[*] 2
"2"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[1,2],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .c[*] 2
"4"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[1,2,3]}"
127.0.0.1:6379> JSON.NUMMULTBY k1 .d[*] 2
"6"
127.0.0.1:6379> JSON.GET k1
"{\"a\":[],\"b\":[2],\"c\":[2,4],\"d\":[2,4,6]}"

127.0.0.1:6379> JSON.SET k2 . '{"a":{}, "b":{"a":1}, "c":{"a":1, "b":2}, "d":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k2 .a.* 2
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.NUMMULTBY k2 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":1,\"b\":2},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .c.* 2
"4"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":1,\"b\":2,\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k2 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k2
"{\"a\":{},\"b\":{\"a\":2},\"c\":{\"a\":2,\"b\":4},\"d\":{\"a\":2,\"b\":4,\"c\":6}}"

127.0.0.1:6379> JSON.SET k3 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"b"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.NUMMULTBY k3 .a.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .b.* 2
"2"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":1,\"b\":\"b\",\"c\":3}}"
127.0.0.1:6379> JSON.NUMMULTBY k3 .c.* 2
(error) WRONGTYPE JSON element is not a number
127.0.0.1:6379> JSON.NUMMULTBY k3 .d.* 2
"6"
127.0.0.1:6379> JSON.GET k3
"{\"a\":{\"a\":\"a\"},\"b\":{\"a\":\"a\",\"b\":2},\"c\":{\"a\":\"a\",\"b\":\"b\"},\"d\":{\"a\":2,\"b\":\"b\",\"c\":6}}"
```

# JSON.OBJLEN
<a name="json-objlen"></a>

パスにあるオブジェクト値のキーの数を取得します。

構文

```
JSON.OBJLEN <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 各パスのオブジェクトの長さを表す整数の配列。
+ 値がオブジェクトでない場合、対応する戻り値は null です。
+ ドキュメントキーが存在しない場合は、null になります。

パスが制限構文の場合:
+ 整数、オブジェクト内のキーの数。
+ 複数のオブジェクトが選択されている場合、このコマンドは最初のオブジェクトの長さを返します。
+ パスの値がオブジェクトでない場合は、`WRONGTYPE` エラーになります。
+ パスが存在しない場合は、`WRONGTYPE` エラーになります。
+ ドキュメントキーが存在しない場合は、null になります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 $.a
1) (integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 $.a.*
(empty array)
127.0.0.1:6379> JSON.OBJLEN k1 $.b
1) (integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 $.b.*
1) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.c
1) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.c.*
1) (nil)
2) (nil)
127.0.0.1:6379> JSON.OBJLEN k1 $.d
1) (integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 $.d.*
1) (nil)
2) (nil)
3) (integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 $.*
1) (integer) 0
2) (integer) 1
3) (integer) 2
4) (integer) 3
5) (nil)
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJLEN k1 .a
(integer) 0
127.0.0.1:6379> JSON.OBJLEN k1 .a.*
(error) NONEXISTENT JSON path does not exist
127.0.0.1:6379> JSON.OBJLEN k1 .b
(integer) 1
127.0.0.1:6379> JSON.OBJLEN k1 .b.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .c
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .c.*
(error) WRONGTYPE JSON element is not an object
127.0.0.1:6379> JSON.OBJLEN k1 .d
(integer) 3
127.0.0.1:6379> JSON.OBJLEN k1 .d.*
(integer) 2
127.0.0.1:6379> JSON.OBJLEN k1 .*
(integer) 0
```

# JSON.OBJKEYS
<a name="json-objkeys"></a>

パスにあるオブジェクト値のキー名を取得します。

構文

```
JSON.OBJKEYS <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 一括文字列の配列の配列。各要素は、一致するオブジェクト内のキーの配列です。
+ 値がオブジェクトでない場合、対応する戻り値は空の値です。
+ ドキュメントキーが存在しない場合は、null になります。

パスが制限構文の場合:
+ 一括文字列の配列。各要素はオブジェクトのキー名です。
+ 複数のオブジェクトが選択されている場合、このコマンドは最初のオブジェクトのキーを返します。
+ パスの値がオブジェクトでない場合は、`WRONGTYPE` エラーになります。
+ パスが存在しない場合は、`WRONGTYPE` エラーになります。
+ ドキュメントキーが存在しない場合は、null になります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 $.*
1) (empty array)
2) 1) "a"
3) 1) "a"
   2) "b"
4) 1) "a"
   2) "b"
   3) "c"
5) (empty array)
127.0.0.1:6379> JSON.OBJKEYS k1 $.d
1) 1) "a"
   2) "b"
   3) "c"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{}, "b":{"a":"a"}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":{"a":3,"b":4}}, "e":1}'
OK
127.0.0.1:6379> JSON.OBJKEYS k1 .*
1) "a"
127.0.0.1:6379> JSON.OBJKEYS k1 .d
1) "a"
2) "b"
3) "c"
```

# JSON.RESP
<a name="json-resp"></a>

Valkey または Redis OSS の Serialization Protocol (RESP) で指定されたパスの JSON 値を返します。値がコンテナの場合、応答は RESP 配列またはネストされた配列になります。
+ JSON null は、RESP Null 一括文字列にマップされます。
+ JSON ブール値は、それぞれの RESP 単純文字列にマッピングされます。
+ 整数は RESP 整数にマップされます。
+ 64 ビット IEEE 倍精度浮動小数点数は、RESP 一括文字列にマッピングされます。
+ JSON 文字列は、RESP 一括文字列にマッピングされます。
+ JSON 配列は RESP 配列として表されます。最初の要素は単純な文字列で、その後に配列の要素が続きます。
+ JSON オブジェクトは RESP 配列として表されます。最初の要素は単純な文字列 \$1 で、その後にキーと値のペアが続きます。それぞれが RESP 一括文字列です。

構文

```
JSON.RESP <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 配列の配列。各配列要素は、1 つのパスにおける値の RESP 形式を表します。
+ ドキュメントキーが存在しない場合は、空の配列になります。

パスが制限構文の場合:
+ パスの値の RESP 形式を表す配列。
+ ドキュメントキーが存在しない場合は、null になります。

**例**

拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 $.address
1) 1) {
   2) 1) "street"
      2) "21 2nd Street"
   3) 1) "city"
      2) "New York"
   4) 1) "state"
      2) "NY"
   5) 1) "zipcode"
      2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.address.*
1) "21 2nd Street"
2) "New York"
3) "NY"
4) "10021-3100"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers
1) 1) [
   2) 1) {
      2) 1) "type"
         2) "home"
      3) 1) "number"
         2) "555 555-1234"
   3) 1) {
      2) 1) "type"
         2) "office"
      3) 1) "number"
         2) "555 555-4567"

127.0.0.1:6379> JSON.RESP k1 $.phoneNumbers[*]
1) 1) {
   2) 1) "type"
      2) "home"
   3) 1) "number"
      2) "212 555-1234"
2) 1) {
   2) 1) "type"
      2) "office"
   3) 1) "number"
      2) "555 555-4567"
```

制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK

127.0.0.1:6379> JSON.RESP k1 .address
1) {
2) 1) "street"
   2) "21 2nd Street"
3) 1) "city"
   2) "New York"
4) 1) "state"
   2) "NY"
5) 1) "zipcode"
   2) "10021-3100"

127.0.0.1:6379> JSON.RESP k1
 1) {
 2) 1) "firstName"
    2) "John"
 3) 1) "lastName"
    2) "Smith"
 4) 1) "age"
    2) (integer) 27
 5) 1) "weight"
    2) "135.25"
 6) 1) "isAlive"
    2) true
 7) 1) "address"
    2) 1) {
       2) 1) "street"
          2) "21 2nd Street"
       3) 1) "city"
          2) "New York"
       4) 1) "state"
          2) "NY"
       5) 1) "zipcode"
          2) "10021-3100"
 8) 1) "phoneNumbers"
    2) 1) [
       2) 1) {
          2) 1) "type"
             2) "home"
          3) 1) "number"
             2) "212 555-1234"
       3) 1) {
          2) 1) "type"
             2) "office"
          3) 1) "number"
             2) "555 555-4567"
 9) 1) "children"
    2) 1) [
10) 1) "spouse"
    2) (nil)
```

# JSON.SET
<a name="json-set"></a>

パスに JSON 値を設定します。

パスがオブジェクトメンバーを要求する場合:
+ 親要素が存在しない場合、このコマンドは NONEXISTENT エラーを返します。
+ 親要素は存在するがオブジェクトではない場合、このコマンドは ERROR を返します。
+ 親要素が存在し、オブジェクトである場合:
  +  メンバーが存在しない場合、親オブジェクトがパスの最後の子である場合にのみ、新しいメンバーが親オブジェクトに追加されます。それ以外の場合、このコマンドは NONEXISTENT エラーを返します。
  +  メンバーが存在する場合、その値は JSON 値に置き換えられます。

パスが配列インデックスを要求する場合:
+ 親要素が存在しない場合、このコマンドは NONEXISTENT エラーを返します。
+ 親要素は存在するが配列ではない場合、このコマンドは ERROR を返します。
+ 親要素は存在するが、インデックスが範囲外である場合、このコマンドは OUTOFBOUNDARIES エラーを返します。
+ 親要素が存在し、インデックスが有効な場合、要素は新しい JSON 値に置き換えられます。

パスがオブジェクトまたは配列を要求する場合、値 (オブジェクトまたは配列) は新しい JSON 値に置き換えられます。

構文

```
JSON.SET <key> <path> <json> [NX | XX] 
```

NX \$1 XX ここで、NX \$1 XX の識別子を 0 個または 1 個持つことができます
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス (必須) - JSON パス。新しいキーの場合、JSON パスはルート「.」でなければなりません。
+ NX (オプション) - パスがルートである場合は、キーが存在しない場合にのみ値を設定します。つまり、新しいドキュメントを挿入します。パスがルートではない場合は、パスが存在しない場合にのみ値を設定します。つまり、ドキュメントに値を挿入します。
+ XX (オプション) - パスがルートの場合は、キーが存在する場合にのみ値を設定します。つまり、既存のドキュメントを置き換えます。パスがルートではない場合は、パスが存在する場合にのみ値を設定します。つまり、既存の値を更新します。

**戻る**
+ 成功した場合は、シンプルな文字列「OK」が返されます。
+ NX または XX 条件が満たされない場合は、null が返されます。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":1, "b":2, "c":3}}'
OK
127.0.0.1:6379> JSON.SET k1 $.a.* '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"a\":{\"a\":0,\"b\":0,\"c\":0}}"

127.0.0.1:6379> JSON.SET k2 . '{"a": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k2 $.a[*] '0'
OK
127.0.0.1:6379> JSON.GET k2
"{\"a\":[0,0,0,0,0]}"
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"c":{"a":1, "b":2}, "e": [1,2,3,4,5]}'
OK
127.0.0.1:6379> JSON.SET k1 .c.a '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,5]}"
127.0.0.1:6379> JSON.SET k1 .e[-1] '0'
OK
127.0.0.1:6379> JSON.GET k1
"{\"c\":{\"a\":0,\"b\":2},\"e\":[1,2,3,4,0]}"
127.0.0.1:6379> JSON.SET k1 .e[5] '0'
(error) OUTOFBOUNDARIES Array index is out of bounds
```

# JSON.STRAPPEND
<a name="json-strappend"></a>

パスの JSON 文字列に文字列を追加します。

構文

```
JSON.STRAPPEND <key> [path] <json_string>
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります
+ json\$1string (必須) — 文字列の JSON 表現。JSON 文字列は引用符で囲む ("foo") 必要があることに注意してください。

**戻る**

パスが拡張構文の場合:
+ 各パスの文字列の新しい長さを表す整数の配列。
+ パスの値が文字列でない場合、対応する戻り値は null です。
+ 入力された json 引数が有効な JSON 文字列でない場合は、`SYNTAXERR ` エラーになります。
+ パスが存在しない場合は、`NONEXISTENT ` エラーになります。

パスが制限構文の場合:
+ 整数、文字列の新しい長さ。
+ 複数の文字列値が選択されている場合、このコマンドは最後に更新された文字列の新しい長さを返します。
+ パスの値が文字列でない場合は、`WRONGTYPE` エラーになります。
+ 入力された json 引数が有効な JSON 文字列でない場合は、`WRONGTYPE` エラーになります。
+ パスが存在しない場合は、`NONEXISTENT` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.a '"a"'
1) (integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 $.a.* '"a"'
1) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.b.* '"a"'
1) (integer) 2
2) (nil)
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.* '"a"'
1) (integer) 2
2) (integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 $.c.b '"a"'
1) (integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 $.d.* '"a"'
1) (nil)
2) (integer) 2
3) (nil)
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRAPPEND k1 .a.a '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .a.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .b.* '"a"'
(integer) 2
127.0.0.1:6379> JSON.STRAPPEND k1 .c.* '"a"'
(integer) 3
127.0.0.1:6379> JSON.STRAPPEND k1 .c.b '"a"'
(integer) 4
127.0.0.1:6379> JSON.STRAPPEND k1 .d.* '"a"'
(integer) 2
```

# JSON.STRLEN
<a name="json-strlen"></a>

パスの JSON 文字列値の長さを取得します。

構文

```
JSON.STRLEN <key> [path] 
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 各パスの文字列値の長さを表す整数の配列。
+ 値が文字列でない場合、対応する戻り値は null です。
+ ドキュメントキーが存在しない場合は、null になります。

パスが制限構文の場合:
+ 整数、文字列の長さ。
+ 複数の文字列値が選択されている場合、このコマンドは最初の文字列の長さを返します。
+ パスの値が文字列でない場合は、`WRONGTYPE` エラーになります。
+ パスが存在しない場合は、`NONEXISTENT` エラーになります。
+ ドキュメントキーが存在しない場合は、null になります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 $.a.a
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.a.*
1) (integer) 1
127.0.0.1:6379> JSON.STRLEN k1 $.c.*
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.c.b
1) (integer) 2
127.0.0.1:6379> JSON.STRLEN k1 $.d.*
1) (nil)
2) (integer) 1
3) (nil)
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 $ '{"a":{"a":"a"}, "b":{"a":"a", "b":1}, "c":{"a":"a", "b":"bb"}, "d":{"a":1, "b":"b", "c":3}}'
OK
127.0.0.1:6379> JSON.STRLEN k1 .a.a
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .a.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.*
(integer) 1
127.0.0.1:6379> JSON.STRLEN k1 .c.b
(integer) 2
127.0.0.1:6379> JSON.STRLEN k1 .d.*
(integer) 1
```

# JSON.TOGGLE
<a name="json-toggle"></a>

パスのブール値を true と false の間で切り替えます。

構文

```
JSON.TOGGLE <key> [path] 
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 各パスの結果のブール値を表す整数 (0 - false、1 - true) の配列。
+ 値がブール値でない場合は、対応する戻り値は null です。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。

パスが制限構文の場合:
+ 結果のブール値を表す文字列 (「true」/「false」)。
+ ドキュメントキーが存在しない場合は、`NONEXISTENT` エラーになります。
+ パスの値がブール値でない場合は、`WRONGTYPE` エラーになります。

**例**

 拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"a":true, "b":false, "c":1, "d":null, "e":"foo", "f":[], "g":{}}'
OK
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 0
2) (integer) 1
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
127.0.0.1:6379> JSON.TOGGLE k1 $.*
1) (integer) 1
2) (integer) 0
3) (nil)
4) (nil)
5) (nil)
6) (nil)
7) (nil)
```

 制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . true
OK
127.0.0.1:6379> JSON.TOGGLE k1
"false"
127.0.0.1:6379> JSON.TOGGLE k1
"true"

127.0.0.1:6379> JSON.SET k2 . '{"isAvailable": false}'
OK
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"true"
127.0.0.1:6379> JSON.TOGGLE k2 .isAvailable
"false"
```

# JSON.TYPE
<a name="json-type"></a>

指定されたパスの値の型を報告します。

構文

```
JSON.TYPE <key> [path]
```
+ キー (必須) - JSON ドキュメントタイプのキー
+ パス「オプショナル」– JSON パス。指定しない場合、デフォルトでルートになります

**戻る**

パスが拡張構文の場合:
+ 各パスの値の型を表す文字列の配列。型は、\$1「null」、「boolean」、「string」、「number」、「integer」、「object」、および「array」\$1のいずれかです。
+ パスが存在しない場合、対応する戻り値は null です。
+ ドキュメントキーが存在しない場合は、空の配列になります。

パスが制限構文の場合:
+ 文字列、値の型
+ ドキュメントキーが存在しない場合は、null になります。
+ JSON パスが無効であるか、存在しない場合は null です。

**例**

拡張パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '[1, 2.3, "foo", true, null, {}, []]'
OK
127.0.0.1:6379> JSON.TYPE k1 $[*]
1) integer
2) number
3) string
4) boolean
5) null
6) object
7) array
```

制限パス構文:

```
127.0.0.1:6379> JSON.SET k1 . '{"firstName":"John","lastName":"Smith","age":27,"weight":135.25,"isAlive":true,"address":{"street":"21 2nd Street","city":"New York","state":"NY","zipcode":"10021-3100"},"phoneNumbers":[{"type":"home","number":"212 555-1234"},{"type":"office","number":"646 555-4567"}],"children":[],"spouse":null}'
OK
127.0.0.1:6379> JSON.TYPE k1
object
127.0.0.1:6379> JSON.TYPE k1 .children
array
127.0.0.1:6379> JSON.TYPE k1 .firstName
string
127.0.0.1:6379> JSON.TYPE k1 .age
integer
127.0.0.1:6379> JSON.TYPE k1 .weight
number
127.0.0.1:6379> JSON.TYPE k1 .isAlive
boolean
127.0.0.1:6379> JSON.TYPE k1 .spouse
null
```