

# 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"}
}
```