

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

# 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 パスは許可されません。これは、お客様のために正しい動作を維持することを目的とした処置です。