

# DynamoDB での式の使用
<a name="Expressions"></a>

Amazon DynamoDB では、式を使用して、項目から読み取る属性の指定、条件が満たされたときのデータの書き込み、項目の更新方法の指定、クエリの定義、クエリ結果のフィルタリングを行うことができます。**

このテーブルでは、式の基本的な文法と利用可能な式の種類について説明します。


| 式タイプ | 説明 | 
| --- | --- | 
| プロジェクション式 | プロジェクション式は、GetItem、Query、Scan などのオペレーションを使用するときに項目から取得する属性を特定します。 | 
| 条件式 | 条件式は、PutItem、UpdateItem、DeleteItem の各オペレーションを使用したときに、どの項目を変更すべきかを決定します。 | 
| 更新式 | 更新式は、UpdateItem で項目の属性を変更する方法を指定します。例えば、スカラー値を設定したり、リストまたはマップから要素を削除したりします。 | 
| キー条件式 | キー条件式は、クエリがテーブルやインデックスから読み取る項目を決定します。 | 
| フィルター式 | フィルター式は、クエリ結果のうち、どの項目を返すべきかを決定します。他のすべての結果は破棄されます。 | 

式の構文と各タイプの式の詳細については、以下のセクションを参照してください。

**Topics**
+ [

# DynamoDB で式を使用する場合の項目属性の参照
](Expressions.Attributes.md)
+ [

# DynamoDB の式の属性名 (エイリアス)
](Expressions.ExpressionAttributeNames.md)
+ [

# DynamoDB での式属性値の使用
](Expressions.ExpressionAttributeValues.md)
+ [

# DynamoDB でのプロジェクション式の使用
](Expressions.ProjectionExpressions.md)
+ [

# DynamoDB での更新式の使用
](Expressions.UpdateExpressions.md)
+ [

# DynamoDB の条件式とフィルター式、演算子、関数
](Expressions.OperatorsAndFunctions.md)
+ [

# DynamoDB 条件式 CLI の例
](Expressions.ConditionExpressions.md)

**注記**  
下位互換性のために、DynamoDB は式を使用しない条件パラメータもサポートします。詳細については、「[レガシー DynamoDB 条件パラメータ](LegacyConditionalParameters.md)」を参照してください。  
新しいアプリケーションでは、レガシーパラメータではなく式を使用する必要があります。

# DynamoDB で式を使用する場合の項目属性の参照
<a name="Expressions.Attributes"></a>

このセクションでは、Amazon DynamoDB で式の項目属性を参照する方法を説明します。複数のリストやマップ内で深くネストされている場合でも、属性を使用できます。

**Topics**
+ [

## 最上位属性
](#Expressions.Attributes.TopLevelAttributes)
+ [

## 入れ子の属性
](#Expressions.Attributes.NestedAttributes)
+ [

## ドキュメントパス
](#Expressions.Attributes.NestedElements.DocumentPathExamples)

**サンプル項目: ProductCatalog**  
このページの例では、`ProductCatalog` テーブルで次のサンプル項目を使用しています (このテーブルについては、「[DynamoDB で使用するテーブルとデータの例](AppendixSampleTables.md)」で説明されています)。

```
{
    "Id": 123,
    "Title": "Bicycle 123",
    "Description": "123 description",
    "BicycleType": "Hybrid",
    "Brand": "Brand-Company C",
    "Price": 500,
    "Color": ["Red", "Black"],
    "ProductCategory": "Bicycle",
    "InStock": true,
    "QuantityOnHand": null,
    "RelatedItems": [
        341,
        472,
        649
    ],
    "Pictures": {
        "FrontView": "http://example.com/products/123_front.jpg",
        "RearView": "http://example.com/products/123_rear.jpg",
        "SideView": "http://example.com/products/123_left_side.jpg"
    },
    "ProductReviews": {
	    "FiveStar": [
	    		"Excellent! Can't recommend it highly enough! Buy it!",
	    		"Do yourself a favor and buy this."
	    ],
	    "OneStar": [
	    		"Terrible product! Do not buy this."
	    ]
    },
    "Comment": "This product sells out quickly during the summer",
    "Safety.Warning": "Always wear a helmet"
 }
```

次の点に注意してください。
+ パーティションキー値 (`Id`) は `123` です。ソートキーはありません。
+ ほとんどの属性に、`String`、`Number`、`Boolean`、`Null` などのスカラーデータ型があります。
+ 1 つの属性 (`Color`) は `String Set` です。
+ 次の属性はドキュメントデータ型です。
  + `RelatedItems` のリスト。各要素は関連製品の `Id` です。
  + `Pictures` のマップ。各要素は対応するイメージファイルの URL と、写真の短い説明です。
  + `ProductReviews` のマップ。各要素は、レーティングと、そのレーティングに対応する評価のリストを表します。最初に、このマップには 5 つ星と 1 つ星の評価が入力されます。

## 最上位属性
<a name="Expressions.Attributes.TopLevelAttributes"></a>

属性が別の属性に組み込まれていない場合、*最上位属性*と呼ばれます。`ProductCatalog` 項目の最上位属性は次のようになります。
+ `Id`
+ `Title`
+ `Description`
+ `BicycleType`
+ `Brand`
+ `Price`
+ `Color`
+ `ProductCategory`
+ `InStock`
+ `QuantityOnHand`
+ `RelatedItems`
+ `Pictures`
+ `ProductReviews`
+ `Comment`
+ `Safety.Warning`

`Color` (リスト)、`RelatedItems` (リスト)、`Pictures` (マップ)、および `ProductReviews` (マップ) を除くすべての最上位属性はスカラーです。

## 入れ子の属性
<a name="Expressions.Attributes.NestedAttributes"></a>

属性が別の属性に組み込まれている場合、*入れ子の属性*と呼ばれます。入れ子の属性にアクセスするには、*間接参照演算子*を使用します。
+ `[n]` — リストの要素
+ `.` (ドット) — マップの要素

### リスト要素へのアクセス
<a name="Expressions.Attributes.NestedElements.AccessingListElements"></a>

リスト要素の間接参照演算子は **[*n*]** で、*n* は要素数です。リストの要素はゼロベースであるため、[0] はリスト内の最初の要素、[1] は 2 番目の要素、という順番で表されます。次に例を示します。
+ `MyList[0]`
+ `AnotherList[12]`
+ `ThisList[5][11]`

要素 `ThisList[5]` は、それ自体がネストされたリストです。したがって、`ThisList[5][11]` は、そのリストの 12 番目の要素を参照します。

角括弧内の数は、負以外の整数である必要があります。そのため、次の式は無効です。
+ `MyList[-1]`
+ `MyList[0.4]`

### マップ要素へのアクセス
<a name="Expressions.Attributes.NestedElements.AccessingMapElements"></a>

マップ要素の間接参照演算子は **.** (ドット) です。マップの要素間の区切り文字として、ドットを使用します。
+ `MyMap.nestedField`
+ `MyMap.nestedField.deeplyNestedField`

## ドキュメントパス
<a name="Expressions.Attributes.NestedElements.DocumentPathExamples"></a>

式では、*ドキュメントパス*を使用して、属性の場所を DynamoDB に伝えます。最上位属性の場合、ドキュメントパスは単純に属性名になります。ネストされた属性の場合は、間接参照演算子を使用してドキュメントパスを構築します。

ドキュメントパスのいくつかの例を次に示します。([DynamoDB で式を使用する場合の項目属性の参照](#Expressions.Attributes) に示された項目を参照してください)
+ 最上位のスカラー属性。

   `Description`
+ 最上位のリスト属性。(これはいくつかの要素だけではなく、すべてを示すリストを返します)

  `RelatedItems`
+ `RelatedItems` リストの 3 番目の要素 （このリスト要素はゼロベースであることに注意してください)。

  `RelatedItems[2]`
+ 製品の正面の写真。

  `Pictures.FrontView`
+ すべての 5 つ星の評価。

  `ProductReviews.FiveStar`
+ 最初の 5 つ星の評価。

  `ProductReviews.FiveStar[0]`

**注記**  
ドキュメントパスの最大深度は 32 です。したがって、任意のパスの間接参照演算子の数はこの制限を超えることはできません。

次の要件を満たしている限り、ドキュメントパスには任意の属性名を使用できます。
+ 最初の文字は `a-z`、`A-Z`、または `0-9`
+ 2 番目の文字 (存在する場合) は `a-z`、`A-Z`

**注記**  
属性名がこの要件を満たさない場合は、式の属性名をプレースホルダーとして定義する必要があります。

詳細については、「[DynamoDB の式の属性名 (エイリアス)](Expressions.ExpressionAttributeNames.md)」を参照してください。

# DynamoDB の式の属性名 (エイリアス)
<a name="Expressions.ExpressionAttributeNames"></a>

式の属性名は、実際の属性名の代わりとして Amazon DynamoDB の式で使用するエイリアス (またはプレースホルダー) です。**式の属性名は、シャープ記号 (`#`) で始める必要があり、1 つ以上の英数字が続きます。アンダースコア (`_`) 文字も使用できます。

このセクションでは、式の属性名を使用する必要があるいくつかの状況について説明します。

**注記**  
このセクションの例では AWS Command Line Interface (AWS CLI) を使用します。

**Topics**
+ [

## 予約語
](#Expressions.ExpressionAttributeNames.ReservedWords)
+ [

## 特殊文字を含む属性名
](#Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters)
+ [

## 入れ子の属性
](#Expressions.ExpressionAttributeNames.NestedAttributes)
+ [

## 属性名を繰り返し参照する
](#Expressions.ExpressionAttributeNames.RepeatingAttributeNames)

## 予約語
<a name="Expressions.ExpressionAttributeNames.ReservedWords"></a>

DynamoDB 予約語と競合する属性名を含む式を書く必要が生じることもあります。予約語の一覧については、「[DynamoDB の予約語](ReservedWords.md)」を参照してください。

たとえば、AWS CLI は予約語であるため、次の `COMMENT` の例は失敗します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Comment"
```

この問題に対処するには、`Comment` を、`#c` などの式の属性名で置き換えることができます。`#`（シャープ記号）は必須であり、これが属性名のプレースホルダーであることを示します。AWS CLI の例は次のようになります。

```
aws dynamodb get-item \
     --table-name ProductCatalog \
     --key '{"Id":{"N":"123"}}' \
     --projection-expression "#c" \
     --expression-attribute-names '{"#c":"Comment"}'
```

**注記**  
属性名が数値で始まるか、スペースまたは予約語を含む場合、式の属性名を使用して式のその属性名を置き換える*必要があります*。

## 特殊文字を含む属性名
<a name="Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters"></a>

式では、ドット (".") はドキュメントパスの区切り文字として解釈されます。ただし、DynamoDB では属性名の一部としてドット文字や、ハイフン (「-」) などの特殊文字を使用することもできます。これは、あいまいな意味を持つことがあります。例として、`ProductCatalog` 項目から `Safety.Warning` 属性を取得するとします ([DynamoDB で式を使用する場合の項目属性の参照](Expressions.Attributes.md) を参照してください)。

プロジェクション式を使用して、`Safety.Warning` にアクセスするとします。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Safety.Warning"
```

DynamoDB は、予想される文字列 ("`Always wear a helmet`") ではなく空の結果を返します。これは、DynamoDB が式のドットをドキュメントパスの区切り文字として解釈するためです。この場合、`#sw` の置換として式の属性名 (`Safety.Warning` など) を定義する必要があります。その後、次のプロジェクション式を使用します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#sw" \
    --expression-attribute-names '{"#sw":"Safety.Warning"}'
```

次に、DynamoDB が正しい結果を返します。

**注記**  
属性名にドット (「.」) またはハイフン (「-」) が含まれている場合は、式の属性名を使用して、式でその属性名を置き換える*必要があります*。

## 入れ子の属性
<a name="Expressions.ExpressionAttributeNames.NestedAttributes"></a>

ネストされた属性 `ProductReviews.OneStar` にアクセスするとします。式の属性名において、DynamoDB はドット (".") を属性名内の文字として扱います。ネストされた属性を参照するには、ドキュメントパス内の要素ごとに式の属性名を定義します。
+ `#pr — ProductReviews`
+ `#1star — OneStar`

その後、プロジェクション式として `#pr.#1star` を使用します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#pr.#1star"  \
    --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'
```

次に、DynamoDB が正しい結果を返します。

## 属性名を繰り返し参照する
<a name="Expressions.ExpressionAttributeNames.RepeatingAttributeNames"></a>

式の属性名は、同じ属性名を繰り返し参照する必要がある場合に役立ちます。たとえば、`ProductCatalog` 項目からいくつかの評価を取得する次の式を考えてみます。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"
```

これをより簡潔にするために、`ProductReviews` を、`#pr` などの式の属性名で置き換えることができます。変更された式は次のようになります。
+  `#pr.FiveStar, #pr.ThreeStar, #pr.OneStar` 

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \
    --expression-attribute-names '{"#pr":"ProductReviews"}'
```

式属性名を定義した場合、式全体で一貫して使用する必要があります。さらに、`#` 記号を省略することはできません。

# DynamoDB での式属性値の使用
<a name="Expressions.ExpressionAttributeValues"></a>

Amazon DynamoDB の式の属性値は変数として機能します。**式の属性値は、比較する実際の値 (ランタイムまでは不明である可能性のある値) の代わりになります。式の属性値はコロン (`:`) で始まり、1 つ以上の英数字が続きます。

たとえば、`ProductCatalog` で入手でき、費用が `Black` 以下の `500` 項目のすべてを返すとします。この `Scan` (AWS Command Line Interface) の例のように AWS CLI オペレーションでフィルタ式を使用できます。

```
aws dynamodb scan \
    --table-name ProductCatalog \
    --filter-expression "contains(Color, :c) and Price <= :p" \
    --expression-attribute-values file://values.json
```

`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。

```
{
    ":c": { "S": "Black" },
    ":p": { "N": "500" }
}
```

式属性値を定義した場合、式全体で一貫して使用する必要があります。さらに、`:` 記号を省略することはできません。

式の属性値は、主な条件式、条件式、更新式、およびフィルター式で使用されます。

# DynamoDB でのプロジェクション式の使用
<a name="Expressions.ProjectionExpressions"></a>

テーブルからデータを読み込むには、次のような `GetItem`、`Query`、または `Scan` のオペレーションを使用します。Amazon DynamoDB は、デフォルトですべての項目属性を返します。すべての属性ではなく、一部の属性のみを取得するには、プロジェクション式を使用します。

*プロジェクション式*は、任意の属性を識別する文字列です。1 つの属性を取得するには、名前を指定します。複数の属性の場合、名前をカンマで区切る必要があります。

`ProductCatalog` からの [DynamoDB で式を使用する場合の項目属性の参照](Expressions.Attributes.md) 項目に基づく、プロジェクション式のいくつかの例を次に示します。
+ 1 つの最上位属性。

  `Title `
+ 3 つの最上位属性。DynamoDB は `Color` セット全体を取得します。

  `Title, Price, Color`
+ 4 つの最上位属性。DynamoDB は `RelatedItems` および `ProductReviews` のコンテンツ全体を返します。

  `Title, Description, RelatedItems, ProductReviews`

**注記**  
プロジェクション式は、プロビジョンドスループットの消費には影響しません。DynamoDB は、アプリケーションに返すデータの量ではなく、項目のサイズに基づいて、キャパシティユニットの消費数を決定します。

**予約語と特殊文字**

DynamoDB には予約語と特殊文字があります。DynamoDB では、これらの予約語と特殊文字を名前に使用できますが、お勧めしません。これらの名前を式で使用するたびに、代わりにエイリアスを使用する必要があるためです。詳細な一覧については、「[DynamoDB の予約語](ReservedWords.md)」を参照してください。

次の場合は、実際の名前の代わりに式の属性名を使用する必要があります。
+ 属性名が DynamoDB の予約語リストにある場合。
+ 最初の文字が `a-z` または `A-Z` で、2 番目の文字 (存在する場合) が `a-Z`、`A-Z`、`0-9` のいずれかでなければならないという要件を属性名が満たしていない場合。
+ 属性名に、**\$1** (ハッシュ) または **:** (コロン) が含まれている場合。

以下の AWS CLI の例に示しているのは、`GetItem` オペレーションでプロジェクション式を使用する方法です。この式は最上位スカラー射影内の属性 (`Description`)、リスト内の最初の要素 (`RelatedItems[0]`)、およびマップ内に入れ子にするリスト (`ProductReviews.FiveStar`) を取得します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '"Id": { "N": "123" } \
    --projection-expression "Description, RelatedItems[0], ProductReviews.FiveStar"
```

この例では、次の JSON が返されます。

```
{
    "Item": {
        "Description": {
            "S": "123 description"
        },
        "ProductReviews": {
            "M": {
                "FiveStar": {
                    "L": [
                        {
                            "S": "Excellent! Can't recommend it highly enough! Buy it!"
                        },
                        {
                            "S": "Do yourself a favor and buy this."
                        }
                    ]
                }
            }
        },
        "RelatedItems": {
            "L": [
                {
                    "N": "341"
                }
            ]
        }
    }
}
```

# DynamoDB での更新式の使用
<a name="Expressions.UpdateExpressions"></a>

`UpdateItem` オペレーションは、既存項目を更新します。また、存在しない場合は新しい項目をテーブルに追加します。更新する項目のキーを指定する必要があります。また、変更する属性を示す更新式と、その式に割り当てる値も指定する必要があります。

*更新式*は、`UpdateItem` が項目の属性を変更する方法を指定します。たとえば、スカラー値を設定したり、リストまたはマップから要素を削除したりします。

更新式の構文の概要を次に示します。

```
update-expression ::=
    [ SET action [, action] ... ]
    [ REMOVE action [, action] ...]
    [ ADD action [, action] ... ]
    [ DELETE action [, action] ...]
```

更新式は、1 つ以上の句で構成されます。各句は、`SET`、`REMOVE`、`ADD`、または `DELETE` キーワードで始まります。これらのいずれの句も、任意の順序で更新式に含めることができます。ただし、各アクションキーワードは 1 回のみ表示できます。

各句内には、カンマで区切った 1 つ以上のアクションがあります。各アクションはデータ変更を表します。

このセクションの例は、`ProductCatalog` の [DynamoDB でのプロジェクション式の使用](Expressions.ProjectionExpressions.md) 項目に基づいています。

以下のトピックでは、`SET` アクションのさまざまなユースケースについて説明します。

**Topics**
+ [

## SET — 項目属性の変更または追加
](#Expressions.UpdateExpressions.SET)
+ [

## REMOVE — 項目から属性を削除
](#Expressions.UpdateExpressions.REMOVE)
+ [

## ADD — 数値とセットの更新
](#Expressions.UpdateExpressions.ADD)
+ [

## DELETE — セットから要素を削除
](#Expressions.UpdateExpressions.DELETE)
+ [

## 複数の更新式を使用する
](#Expressions.UpdateExpressions.Multiple)

## SET — 項目属性の変更または追加
<a name="Expressions.UpdateExpressions.SET"></a>

1 つ以上の属性を項目に追加するには、更新式で `SET` アクションを使用します。これらのいずれかの属性が既に存在する場合、新しい値で上書きされます。既存の属性の上書きを回避するには、`SET` で `if_not_exists` 関数を使用できます。`if_not_exists` 関数は `SET` アクションに固有で、更新式でのみ使用できます。

`SET` を使用してリスト要素を更新すると、その要素のコンテンツは、指定した新しいデータで置き換えられます。要素が既に存在していない場合、`SET` はリストの末尾に新しい要素を追加します。

1 つの `SET` オペレーションに複数の要素を追加すると、要素は要素番号で順にソートされます。

`SET` を使用して、`Number` 型である属性を増減することもできます。複数の `SET` アクションを実行するには、オペレーションをカンマで区切ります。

次の構文の概要について説明します。
+ *path* 要素は、項目へのドキュメントパスです。
+ **operand** 要素は、項目へのドキュメントパスまたは関数とすることができます。

```
set-action ::=
    path = value

value ::=
    operand
    | operand '+' operand
    | operand '-' operand

operand ::=
    path | function

function ::=
    if_not_exists (path, value)
```

項目の指定したパスに属性が含まれていない場合、`if_not_exists` は `value` に評価されます。それ以外の場合は、`path` に評価されます。

次の `PutItem` オペレーションは、例で参照するサンプル項目を作成します。

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json
```

`--item` の引数は、ファイル `item.json` に保存されます。(分かりやすいように、いくつかの項目属性のみが使用されます)

```
{
    "Id": {"N": "789"},
    "ProductCategory": {"S": "Home Improvement"},
    "Price": {"N": "52"},
    "InStock": {"BOOL": true},
    "Brand": {"S": "Acme"}
}
```

**Topics**
+ [

### 属性の変更
](#Expressions.UpdateExpressions.SET.ModifyingAttributes)
+ [

### リストおよびマップの追加
](#Expressions.UpdateExpressions.SET.AddingListsAndMaps)
+ [

### リストに要素を追加
](#Expressions.UpdateExpressions.SET.AddingListElements)
+ [

### ネストされたマップ属性の追加
](#Expressions.UpdateExpressions.SET.AddingNestedMapAttributes)
+ [

### 数値属性の増減
](#Expressions.UpdateExpressions.SET.IncrementAndDecrement)
+ [

### リストに要素を追加
](#Expressions.UpdateExpressions.SET.UpdatingListElements)
+ [

### 既存の属性の上書きを防止
](#Expressions.UpdateExpressions.SET.PreventingAttributeOverwrites)

### 属性の変更
<a name="Expressions.UpdateExpressions.SET.ModifyingAttributes"></a>

**Example**  
`ProductCategory` 属性および `Price` 属性を更新します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET ProductCategory = :c, Price = :p" \
    --expression-attribute-values file://values.json \
    --return-values ALL_NEW
```
`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。  

```
{
    ":c": { "S": "Hardware" },
    ":p": { "N": "60" }
}
```

**注記**  
`UpdateItem` オペレーションでは、`--return-values ALL_NEW` を指定すると、DynamoDB は更新後に表示される項目を返します。

### リストおよびマップの追加
<a name="Expressions.UpdateExpressions.SET.AddingListsAndMaps"></a>

**Example**  
新しいリストおよび新しいマップを追加します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET RelatedItems = :ri, ProductReviews = :pr" \
    --expression-attribute-values file://values.json \
    --return-values ALL_NEW
```
`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。  

```
{
    ":ri": {
        "L": [
            { "S": "Hammer" }
        ]
    },
    ":pr": {
        "M": {
            "FiveStar": {
                "L": [
                    { "S": "Best product ever!" }
                ]
            }
        }
    }
}
```

### リストに要素を追加
<a name="Expressions.UpdateExpressions.SET.AddingListElements"></a>

**Example**  
新しい属性を `RelatedItems` リストに追加します。リストの要素はゼロベースであるため、[0] はリスト内の最初の要素、[1] は 2 番目の要素、という順番で表されることに注意してください。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET RelatedItems[1] = :ri" \
    --expression-attribute-values file://values.json \
    --return-values ALL_NEW
```
`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。  

```
{
    ":ri": { "S": "Nails" }
}
```

**注記**  
`SET` を使用してリスト要素を更新すると、その要素のコンテンツは、指定した新しいデータで置き換えられます。要素が既に存在していない場合、`SET` はリストの末尾に新しい要素を追加します。  
1 つの `SET` オペレーションに複数の要素を追加すると、要素は要素番号で順にソートされます。

### ネストされたマップ属性の追加
<a name="Expressions.UpdateExpressions.SET.AddingNestedMapAttributes"></a>

**Example**  
ネストされたマップ属性を追加します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET #pr.#5star[1] = :r5, #pr.#3star = :r3" \
    --expression-attribute-names file://names.json \
    --expression-attribute-values file://values.json \
    --return-values ALL_NEW
```
`--expression-attribute-names` の引数は、ファイル `names.json` に保存されます。  

```
{
    "#pr": "ProductReviews",
    "#5star": "FiveStar",
    "#3star": "ThreeStar"
}
```
`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。  

```
{
    ":r5": { "S": "Very happy with my purchase" },
    ":r3": {
        "L": [
            { "S": "Just OK - not that great" }
        ]
    }
}
```

**重要**  
親マップが存在しない場合、ネストされたマップ属性を更新することはできません。親マップ (`ProductReviews.FiveStar`) が存在しない場合にネストされた属性 (`ProductReviews` など) を更新しようとすると、DynamoDB は*「更新式で指定されたドキュメントパスは更新に無効です」*というメッセージで `ValidationException` を返します。  
ネストされたマップ属性を後で更新する項目を作成する場合は、親属性の空のマップを初期化します。例えば、次のようになります。  

```
{
    "Id": {"N": "789"},
    "ProductReviews": {"M": {}},
    "Metadata": {"M": {}}
}
```
これにより、`ProductReviews.FiveStar` のようなネストされた属性をエラーなしで更新できます。

### 数値属性の増減
<a name="Expressions.UpdateExpressions.SET.IncrementAndDecrement"></a>

既存の数値属性は増減することができます。これを行うには、`+`（プラス）および `-`（マイナス）演算子を使用します。

**Example**  
項目の `Price` を下げます。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET Price = Price - :p" \
    --expression-attribute-values '{":p": {"N":"15"}}' \
    --return-values ALL_NEW
```
`Price` を上げるために、更新式で `+` 演算子を使用します。

### リストに要素を追加
<a name="Expressions.UpdateExpressions.SET.UpdatingListElements"></a>

リストの最後に要素を追加できます。これを行うには、`SET` 関数の `list_append`を使用します。(関数名では、大文字と小文字が区別されます)。`list_append` 関数は `SET` アクションに固有で、更新式でのみ使用できます。構文は次のとおりです。
+ `list_append (list1, list2)`

この関数は、入力として 2 つのリストを受け取り、`list2` のすべての要素を ` list1` に追加します。

**Example**  
[リストに要素を追加](#Expressions.UpdateExpressions.SET.AddingListElements) で、`RelatedItems` リストを追加し `Hammer` と `Nails` の 2 つの要素を追加します。次に、`RelatedItems` の末尾にさらに 2 つの要素を追加します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET #ri = list_append(#ri, :vals)" \
    --expression-attribute-names '{"#ri": "RelatedItems"}' \
    --expression-attribute-values file://values.json  \
    --return-values ALL_NEW
```
`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。  

```
{
    ":vals": {
        "L": [
            { "S": "Screwdriver" },
            {"S": "Hacksaw" }
        ]
    }
}
```
最後に、`RelatedItems` の*先頭*にもう 1 つの要素を追加します。これを実行するには、`list_append` 要素の順序を入れ替えます。(`list_append` は 2 つのリストを入力し、1 番目のリストに 2 番目のリストを追加することに注意してください)。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET #ri = list_append(:vals, #ri)" \
    --expression-attribute-names '{"#ri": "RelatedItems"}' \
    --expression-attribute-values '{":vals": {"L": [ { "S": "Chisel" }]}}' \
    --return-values ALL_NEW
```
生成される `RelatedItems` 属性には次の順序で 5 つの要素が含まれます。`Chisel`、`Hammer`、`Nails`、`Screwdriver`、 `Hacksaw`。

### 既存の属性の上書きを防止
<a name="Expressions.UpdateExpressions.SET.PreventingAttributeOverwrites"></a>

**Example**  
項目にすでに `Price` 属性がない場合にのみ、項目の `Price` を設定します (`Price` がすでに存在する場合は何も起こりません)。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET Price = if_not_exists(Price, :p)" \
    --expression-attribute-values '{":p": {"N": "100"}}' \
    --return-values ALL_NEW
```

## REMOVE — 項目から属性を削除
<a name="Expressions.UpdateExpressions.REMOVE"></a>

1 つ以上の属性を Amazon DynamoDB の項目から削除するには、更新式で `REMOVE` アクションを使用します。複数の `REMOVE` アクションを実行するには、オペレーションをカンマで区切ります。

更新式の `REMOVE` の構文の概要を次に示します。唯一のオペランドは、削除する属性のドキュメントパスです。

```
remove-action ::=
    path
```

**Example**  
項目から属性を削除します。(属性が存在しない場合は、何も起こりません)。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "REMOVE Brand, InStock, QuantityOnHand" \
    --return-values ALL_NEW
```

### リストから要素を削除
<a name="Expressions.UpdateExpressions.REMOVE.RemovingListElements"></a>

`REMOVE` を使用して、リストから個別要素を削除できます。

**Example**  
[リストに要素を追加](#Expressions.UpdateExpressions.SET.UpdatingListElements) で、5 つの要素を含むようにリスト属性 (`RelatedItems`) を変更します。  
+ `[0]`—`Chisel`
+ `[1]`—`Hammer`
+ `[2]`—`Nails`
+ `[3]`—`Screwdriver`
+ `[4]`—`Hacksaw`
次の AWS Command Line Interface (AWS CLI) の例では、リストから `Hammer` と `Nails` を削除します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "REMOVE RelatedItems[1], RelatedItems[2]" \
    --return-values ALL_NEW
```
`Hammer` と `Nails` を削除すると、残りの要素は変わります。リストには以下が含まれます。  
+ `[0]`—`Chisel`
+ `[1]`—`Screwdriver`
+ `[2]`—`Hacksaw`

## ADD — 数値とセットの更新
<a name="Expressions.UpdateExpressions.ADD"></a>

**注記**  
一般的に、べき等なオペレーションを確保するために `ADD` ではなく `SET` を使用することをお勧めします。

項目に新しい属性および値を追加するには、更新式で `ADD` アクションを使用します。

属性が既に存在する場合、`ADD` の動作は属性のデータ型によって決まります。
+ 属性が数値で、追加する値も数値である場合、値は既存の属性に数学的に追加されます (値が負の数値である場合は、既存の属性から減算されます)。
+ 属性が設定され、追加する値も設定された場合、値は既存のセットに付加されます。

**注記**  
`ADD` アクションでは、数値とセットデータ型のみがサポートされます。

複数の `ADD` アクションを実行するには、オペレーションをカンマで区切ります。

次の構文の概要について説明します。
+ *path* 要素は、属性へのドキュメントパスです。属性は `Number` またはセットデータ型である必要があります。
+ *value* 要素は、属性に追加する数値 (`Number` データ型の場合)、または属性に付加するセット (セット型の場合) です。

```
add-action ::=
    path value
```

以下のトピックでは、`ADD` アクションのさまざまなユースケースについて説明します。

**Topics**
+ [

### 数値の追加
](#Expressions.UpdateExpressions.ADD.Number)
+ [

### セットに要素を追加
](#Expressions.UpdateExpressions.ADD.Set)

### 数値の追加
<a name="Expressions.UpdateExpressions.ADD.Number"></a>

`QuantityOnHand` 属性が存在しないと想定します。次の AWS CLI の例では、`QuantityOnHand` を 5 に設定します。

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "ADD QuantityOnHand :q" \
    --expression-attribute-values '{":q": {"N": "5"}}' \
    --return-values ALL_NEW
```

これで `QuantityOnHand` が存在するようになったので、`QuantityOnHand` が毎回 5 増分するように例を再実行できます。

### セットに要素を追加
<a name="Expressions.UpdateExpressions.ADD.Set"></a>

`Color` 属性が存在しないと想定します。次の AWS CLI の例では、`Color` を 2 つの要素を持つ文字列セットに設定します。

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "ADD Color :c" \
    --expression-attribute-values '{":c": {"SS":["Orange", "Purple"]}}' \
    --return-values ALL_NEW
```

これで `Color` が存在するので、さらに要素を追加できます。

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "ADD Color :c" \
    --expression-attribute-values '{":c": {"SS":["Yellow", "Green", "Blue"]}}' \
    --return-values ALL_NEW
```

## DELETE — セットから要素を削除
<a name="Expressions.UpdateExpressions.DELETE"></a>

**重要**  
`DELETE` は `Set` データ型のみをサポートします。

1 つ以上の要素をセットから削除するには、更新式で `DELETE` アクションを使用します。複数の `DELETE` アクションを実行するには、オペレーションをカンマで区切ります。

次の構文の概要について説明します。
+ *path* 要素は、属性へのドキュメントパスです。属性はセットデータ型である必要があります。
+ *サブセット*は *path* から削除する 1 つ以上の要素です。*サブセット*はセット型として指定する必要があります。

```
delete-action ::=
    path subset
```

**Example**  
[セットに要素を追加](#Expressions.UpdateExpressions.ADD.Set) で、`Color` 文字列セットを作成します。この例では、セットから要素の一部を削除します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "DELETE Color :p" \
    --expression-attribute-values '{":p": {"SS": ["Yellow", "Purple"]}}' \
    --return-values ALL_NEW
```

## 複数の更新式を使用する
<a name="Expressions.UpdateExpressions.Multiple"></a>

単一の更新式で複数のアクションを使用できます。すべての属性参照は、いずれかのアクションが適用される前に、項目の状態に対して解決されます。

**Example**  
項目 `{"id": "1", "a": 1, "b": 2, "c": 3}` を指定すると、次の式は `a` を削除し、`b` と `c` の値をシフトします。  

```
aws dynamodb update-item \
    --table-name test \
    --key '{"id":{"S":"1"}}' \
    --update-expression "REMOVE a SET b = a, c = b" \
    --return-values ALL_NEW
```
結果は、`{"id": "1", "b": 1, "c": 2}` です。同じ式で `a` が削除され、`b` が再割り当てされても、両方の参照は元の値に解決されます。

**Example**  
属性の値を変更して別の属性を完全に削除したい場合は、SET アクションと REMOVE アクションを 1 つのステートメントで使用できます。このオペレーションでは、`Price` 値を 15 に減らし、項目から `InStock` 属性も削除します。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET Price = Price - :p REMOVE InStock" \
    --expression-attribute-values '{":p": {"N":"15"}}' \
    --return-values ALL_NEW
```

**Example**  
リストに追加しつつ別の属性の値も変更したい場合は、1 つのステートメントで 2 つの SET アクションを使用できます。このオペレーションでは、`RelatedItems` リスト属性に「Nails」が追加され、`Price` 値も 21 に設定されます。  

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"789"}}' \
    --update-expression "SET RelatedItems[1] = :newValue, Price = :newPrice" \
    --expression-attribute-values '{":newValue": {"S":"Nails"}, ":newPrice": {"N":"21"}}'  \
    --return-values ALL_NEW
```

# DynamoDB の条件式とフィルター式、演算子、関数
<a name="Expressions.OperatorsAndFunctions"></a>

Amazon DynamoDB テーブルのデータを操作するには、`PutItem`、`UpdateItem`、`DeleteItem` の各オペレーションを使用します。これらのデータ操作オペレーションでは、どの項目を修正する必要があるかを判断するために、条件式を指定できます。条件式が true と評価される場合、オペレーションは成功します。それ以外の場合は、このオペレーションは失敗します。

このセクションでは、Amazon DynamoDB の書き込みフィルター式と条件式の組み込み関数およびキーワードについて説明します。DynamoDB で使用する関数とプログラミングの詳細については、「[DynamoDB と AWS SDK を使用したプログラミング](Programming.md)」と「[DynamoDB API リファレンス](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/)」を参照してください。

**Topics**
+ [

## フィルター式と条件式の構文
](#Expressions.OperatorsAndFunctions.Syntax)
+ [

## 比較の実行
](#Expressions.OperatorsAndFunctions.Comparators)
+ [

## 関数
](#Expressions.OperatorsAndFunctions.Functions)
+ [

## 論理評価
](#Expressions.OperatorsAndFunctions.LogicalEvaluations)
+ [

## 括弧
](#Expressions.OperatorsAndFunctions.Parentheses)
+ [

## 条件の優先順位
](#Expressions.OperatorsAndFunctions.Precedence)

## フィルター式と条件式の構文
<a name="Expressions.OperatorsAndFunctions.Syntax"></a>

以下の構文の概要で、*operand* は次のいずれかです。
+ 最上位の属性名 (`Id`、`Title`、`Description`、`ProductCategory` など)
+ 入れ子の属性を参照するドキュメントパス

```
condition-expression ::=
      operand comparator operand
    | operand BETWEEN operand AND operand
    | operand IN ( operand (',' operand (, ...) ))
    | function
    | condition AND condition
    | condition OR condition
    | NOT condition
    | ( condition )

comparator ::=
    =
    | <>
    | <
    | <=
    | >
    | >=

function ::=
    attribute_exists (path)
    | attribute_not_exists (path)
    | attribute_type (path, type)
    | begins_with (path, substr)
    | contains (path, operand)
    | size (path)
```

## 比較の実行
<a name="Expressions.OperatorsAndFunctions.Comparators"></a>

これらのコンパレータを使用して、オペランドを単一の値と比較します。
+ `a = b` — *a* が *b* と等しい場合、True
+ `a <> b` — *a* が *b* と等しくない場合、True
+ `a < b` — *a* が *b* 未満の場合、True
+ `a <= b` — *a* が *b* 以下である場合、True
+ `a > b` — *a* が *b* より大きい場合、True
+ `a >= b` — *a* が *b* 以上である場合、True

値の範囲または値の列挙リストに対してオペランドを比較するには、`BETWEEN` および `IN` キーワードを使用します。
+ `a BETWEEN b AND c` - *a* が *b* 以上で、*c* 以下である場合、True。
+ `a IN (b, c, d) ` — *a* がリスト内の任意の値と等しい場合、True。例では、*b*、*c*、*d* のいずれかと等しい場合。リストには、コンマで区切って最大 100 個の値を指定できます。

## 関数
<a name="Expressions.OperatorsAndFunctions.Functions"></a>

以下の関数を使用して、ある属性が項目に存在するか判定したり、属性の値を評価したりします。これらの関数名では大文字と小文字が区別されます。入れ子の属性では、完全ドキュメントパスを指定する必要があります。


****  

| 関数 | 説明 | 
| --- | --- | 
|  `attribute_exists (path)`  | 項目に、`path` で指定した属性が含まれる場合、true。 例: `Product` テーブルの項目に側面図があるかどうかを確認します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  | 
|  `attribute_not_exists (path)`  | `path` で指定した属性が項目に存在しない場合、true。 例: 項目に `Manufacturer` 属性があるかどうかを確認します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  | 
|  `attribute_type (path, type)`  |  指定したパスの属性が、特定のデータ型のものである場合、true。`type` パラメータは次のいずれかである必要があります。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) `type` パラメータには、式の属性値を使用する必要があります。 例: `QuantityOnHand` 属性がリスト型のものであるかどうかを確認します。この例では、`:v_sub` は文字列 `L` のプレースホルダーです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) `type` パラメータには、式の属性値を使用する必要があります。  | 
|  `begins_with (path, substr)`  |  `path` で指定された属性が特定のサブ文字列から始まる場合、true。 例: 正面図 URL の最初の数文字が `http://` かどうかを確認します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) 式の属性値 `:v_sub` は、`http://` のプレースホルダーです。  | 
|  `contains (path, operand)`  | `path` で指定された属性が次の属性である場合、true。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) `path` で指定された属性が `String` である場合、`operand` は `String` である必要があります。`path` で指定された属性が `Set` の場合、`operand` は一連の要素タイプである必要があります。 パスとオペランドは区別する必要があります。つまり、`contains (a, a)` がエラーを返します。 例: `Brand` 属性にサブ文字列 `Company` が含まれているかどうかを確認します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) 式の属性値 `:v_sub` は、`Company` のプレースホルダーです。 例: 製品が赤で入手可能かどうかを確認します。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html) 式の属性値 `:v_sub` は、`Red` のプレースホルダーです。 | 
|  `size (path)`  | 属性のサイズを表す数値を返します。以下は、`size` で使用できる有効なデータ型です。  属性は `String` 型で、`size` は文字列の長さを返します。 例: 文字列 `Brand` が 20 文字以下であるかどうかを確認します。式の属性値 `:v_sub` は、`20` のプレースホルダーです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  属性が `Binary` バイナリ型の場合、`size` は属性値のバイト数を返します。 例: `ProductCatalog` 項目に `VideoClip` という名前のバイナリ属性があるとします。この属性には使用中の製品の短いビデオが含まれます。次の式は、`VideoClip` が 64,000 バイトを超えるかどうかを確認します。式の属性値 `:v_sub` は、`64000` のプレースホルダーです。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  属性が `Set` データ型の場合、`size` は設定の要素数を返します。 例: 製品が複数の色で入手可能かどうかを確認します。式の属性値 `:v_sub` は、`1` のプレースホルダーです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  属性が `List` 型または `Map` のものである場合、`size` は子要素の数を返します。 例: `OneStar` のレビューの数が特定のしきい値を超えたかどうかを確認します。式の属性値 `:v_sub` は、`3` のプレースホルダーです。 [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.OperatorsAndFunctions.html)  | 

## 論理評価
<a name="Expressions.OperatorsAndFunctions.LogicalEvaluations"></a>

論理評価を実行するには、`AND`、`OR`、`NOT` キーワードを使用します。以下のリストでは、*a* と *b* は評価される条件を示しています。
+ `a AND b` — *a* と *b* の両方が true である場合、True。
+ `a OR b` — *a* または *b* のどちらか (または両方) が true の場合、True。
+ `NOT a`— *a* が false の場合は True。*a* が true の場合は Falsee。

以下は、オペレーションの AND のコード例です。

`dynamodb-local (*)> select * from exprtest where a > 3 and a < 5;`

## 括弧
<a name="Expressions.OperatorsAndFunctions.Parentheses"></a>

論理評価の優先順位を変更するには括弧を使用します。たとえば、条件 *a* と *b* が true で、条件 *c* が false であるとします。次の式は true と評価されます。
+ `a OR b AND c`

しかし、条件を括弧で囲むと、それが最初に評価されます。たとえば、次の式は false と評価されます。
+  `(a OR b) AND c`

**注記**  
式では括弧を入れ子にできます。最も内側の括弧が最初に評価されます。

以下は、論理評価で括弧を付けたコード例です。

`dynamodb-local (*)> select * from exprtest where attribute_type(b, string) or ( a = 5 and c = “coffee”);`

## 条件の優先順位
<a name="Expressions.OperatorsAndFunctions.Precedence"></a>

 DynamoDB では、条件は次の優先順位ルールを使用して左から右に評価されます。
+ `= <> < <= > >=`
+ `IN`
+ `BETWEEN`
+ `attribute_exists attribute_not_exists begins_with contains`
+ 括弧
+ `NOT`
+ `AND`
+ `OR`

# DynamoDB 条件式 CLI の例
<a name="Expressions.ConditionExpressions"></a>

条件式を使用する AWS Command Line Interface (AWS CLI) の例のいくつかを次に示します。これらの例は、「`ProductCatalog`」で紹介されている [DynamoDB で式を使用する場合の項目属性の参照](Expressions.Attributes.md) テーブルに基づいています。このテーブルのパーティションキーは `Id` です。ソートキーはありません。次の `PutItem` オペレーションは、例で参照するサンプル `ProductCatalog` 項目を作成します。

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json
```

`--item` の引数は、ファイル `item.json` に保存されます。(分かりやすいように、いくつかの項目属性のみが使用されます)

```
{
    "Id": {"N": "456" },
    "ProductCategory": {"S": "Sporting Goods" },
    "Price": {"N": "650" }
}
```

**Topics**
+ [

## 条件付き配置
](#Expressions.ConditionExpressions.PreventingOverwrites)
+ [

## 条件付き削除
](#Expressions.ConditionExpressions.AdvancedComparisons)
+ [

## 条件付き更新
](#Expressions.ConditionExpressions.SimpleComparisons)
+ [

## 条件式の例
](#Expressions.ConditionExpressions.ConditionalExamples)

## 条件付き配置
<a name="Expressions.ConditionExpressions.PreventingOverwrites"></a>

`PutItem` オペレーションはプライマリキーが同じ項目を上書きします (存在する場合)。これを回避するには、条件式を使用します。これにより、問題の項目が同じプライマリキーを持っていない場合にのみ書き込みが続行されます。

次の例では、`attribute_not_exists()` を使用して、書き込み操作を試みる前に、プライマリキーがテーブルに存在するかどうかを確認しています。

**注記**  
プライマリキーがパーティションキー (pk) とソートキー (sk) の両方で構成されている場合、このパラメータは、書き込みオペレーションを試みる前に `attribute_not_exists(pk)` と `attribute_not_exists(sk)` の両方がステートメント全体として true または false のどちらに評価されるのかを確認します。

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item file://item.json \
    --condition-expression "attribute_not_exists(Id)"
```

条件式が false と評価し、DynamoDB は次のエラーメッセージを返します。条件付きリクエストが失敗しました。

**注記**  
`attribute_not_exists` および他の関数についての詳細は、「[DynamoDB の条件式とフィルター式、演算子、関数](Expressions.OperatorsAndFunctions.md)」を参照してください。

## 条件付き削除
<a name="Expressions.ConditionExpressions.AdvancedComparisons"></a>

条件付き削除を実行するには、条件式とともに `DeleteItem` オペレーションを使用します。条件式は、オペレーションが成功するためには true に評価される必要があります。それ以外の場合、オペレーションは失敗します。

上で定義した項目について考えてみます。

次の条件を満たしている場合にだけ項目を削除するとします。
+  `ProductCategory` は「Sporting Goods」または「Gardening Supplies」のどちらかです。
+  `Price` は 500～600 です。

次の例では、項目を削除しようとしています。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"456"}}' \
    --condition-expression "(ProductCategory IN (:cat1, :cat2)) and (Price between :lo and :hi)" \
    --expression-attribute-values file://values.json
```

`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。

```
{
    ":cat1": {"S": "Sporting Goods"},
    ":cat2": {"S": "Gardening Supplies"},
    ":lo": {"N": "500"},
    ":hi": {"N": "600"}
}
```

**注記**  
条件式では、`:` (コロン文字) は*式の属性値* (実際の値のプレースホルダー) を示します。詳細については、「」を参照してください[DynamoDB での式属性値の使用](Expressions.ExpressionAttributeValues.md)  
`IN`、`AND` およびその他のキーワードについての詳細は、「[DynamoDB の条件式とフィルター式、演算子、関数](Expressions.OperatorsAndFunctions.md)」を参照してください。

この例では、`ProductCategory` 比較の評価結果は true になりますが、`Price` 比較は false と評価されます。これにより、条件式は false と評価され、`DeleteItem` オペレーションは失敗します。

## 条件付き更新
<a name="Expressions.ConditionExpressions.SimpleComparisons"></a>

条件付き更新を実行するには、条件式とともに `UpdateItem` オペレーションを使用します。条件式は、オペレーションが成功するためには true に評価される必要があります。それ以外の場合、オペレーションは失敗します。

**注記**  
`UpdateItem` は*更新式*もサポートします。項目に加える変更を指定する変更内容を指定します。詳細については、「[DynamoDB での更新式の使用](Expressions.UpdateExpressions.md)」を参照してください。

上で定義した項目から開始するとします。

次の例では、`UpdateItem` オペレーションを実行します。製品の `Price` を 75 減らしようとしていますが、現在の `Price` が 500 以下の場合、条件式が更新を防ぎます。

```
aws dynamodb update-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --update-expression "SET Price = Price - :discount" \
    --condition-expression "Price > :limit" \
    --expression-attribute-values file://values.json
```

`--expression-attribute-values` の引数は、ファイル `values.json` に保存されます。

```
{
    ":discount": { "N": "75"},
    ":limit": {"N": "500"}
}
```

開始 `Price` が 650 の場合、`UpdateItem` オペレーションによって `Price` は 575 に下げられます。`UpdateItem` アクションを再度実行すると、`Price` は 500 に減らされます。3 度目に実行した場合、条件式は false と評価されて、更新は失敗します。

**注記**  
条件式では、`:` (コロン文字) は*式の属性値* (実際の値のプレースホルダー) を示します。詳細については、「[DynamoDB での式属性値の使用](Expressions.ExpressionAttributeValues.md)」を参照してください。  
「*>*」およびその他の演算子についての詳細は、「[DynamoDB の条件式とフィルター式、演算子、関数](Expressions.OperatorsAndFunctions.md)」を参照してください。

## 条件式の例
<a name="Expressions.ConditionExpressions.ConditionalExamples"></a>

次の例で使用される関数の詳細については、「[DynamoDB の条件式とフィルター式、演算子、関数](Expressions.OperatorsAndFunctions.md)」を参照してください。式で異なる属性タイプを指定する方法の詳細については、「[DynamoDB で式を使用する場合の項目属性の参照](Expressions.Attributes.md)」を参照してください。

### 項目の属性を確認
<a name="Expressions.ConditionExpressions.CheckingForAttributes"></a>

属性が存在するか (または存在しないか) を確認できます。条件式が true と評価される場合、オペレーションは成功で、それ以外の場合、オペレーションは失敗です。

次の例では、`attribute_not_exists` 属性がない場合にのみ製品を削除するために `Price` を使用します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_not_exists(Price)"
```

DynamoDB は `attribute_exists` 関数も提供します。次の例では、悪いレビューを受け取った場合のみ製品を削除します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_exists(ProductReviews.OneStar)"
```

### 属性タイプの確認
<a name="Expressions.ConditionExpressions.CheckingForAttributeType"></a>

属性値のデータ型は、`attribute_type` 関数を使用して確認できます。条件式が true と評価される場合、オペレーションは成功で、それ以外の場合、オペレーションは失敗です。

次の例では、`attribute_type` を使用して、文字列セットタイプの `Color` 属性がある場合にのみ、製品を削除します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "attribute_type(Color, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values` の引数は、expression-attribute-values.json ファイルに格納されます。

```
{
    ":v_sub":{"S":"SS"}
}
```

### 文字列開始値の確認
<a name="Expressions.ConditionExpressions.CheckingBeginsWith"></a>

文字列属性値が特定のサブ文字列で始まるかどうかを確認するには、`begins_with` 関数を使用します。条件式が true と評価される場合、オペレーションは成功で、それ以外の場合、オペレーションは失敗です。

次の例では、`begins_with` マップの `FrontView` 要素が特定の値で始まる場合にのみ、`Pictures` を使用して製品を削除します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "begins_with(Pictures.FrontView, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values` の引数は、expression-attribute-values.json ファイルに格納されます。

```
{
    ":v_sub":{"S":"http://"}
}
```

### セット内の要素の確認
<a name="Expressions.ConditionExpressions.CheckingForContains"></a>

`contains` 関数を使用して、セット内の要素を確認したり、文字列内のサブ文字列を検索したりできます。条件式が true と評価される場合、オペレーションは成功で、それ以外の場合、オペレーションは失敗です。

次の例では、`contains` 文字列セットに特定の値を持つ要素がある場合にのみ、`Color` を使用して製品を削除します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "contains(Color, :v_sub)" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values` の引数は、expression-attribute-values.json ファイルに格納されます。

```
{
    ":v_sub":{"S":"Red"}
}
```

### 属性値のサイズの確認
<a name="Expressions.ConditionExpressions.CheckingForSize"></a>

属性値のサイズを確認するには、`size` 関数を使用します。条件式が true と評価される場合、オペレーションは成功で、それ以外の場合、オペレーションは失敗です。

次の例では、`size` バイナリ属性のサイズが `VideoClip` バイトより大きい場合にのみ `64000` を使用して、製品を削除します。

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{"Id": {"N": "456"}}' \
    --condition-expression "size(VideoClip) > :v_sub" \
    --expression-attribute-values file://expression-attribute-values.json
```

`--expression-attribute-values` の引数は、expression-attribute-values.json ファイルに格納されます。

```
{
    ":v_sub":{"N":"64000"}
}
```