DynamoDBメモ (+PHP SDK2)



## データ型

| キー名      | データ型       | 説明      |
|:-----------|------------:|:------------:|
|S           | String 			|      |
|N           | Number 			|      |
|B           | Binary 			|      |
|SS          | A set of strings |      |
|NS          | A set of numbers |      |
|BS          | A set of binary 	|      |




## クライアントの生成 / DynamoDbClient#factory


```php

<?php
use Aws\DynamoDb\DynamoDbClient;

$dynamo = DynamoDbClient::factory(array(
    'key'    => AWS_KEY,
    'secret' => AWS_SECRET,
    'region' => AWS_REGION,
));

```


## データの登録 / DynamoDbClient#putItem
http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.DynamoDb.DynamoDbClient.html#_putItem

```php
<?php

$result = $dynamo->putItem(
	array(
		'TableName' => 'table_name',
		'Item' => $dynamo->formatAttributes(
			array(
				'key1'  => $value1,
				'key2'  => $value2,
				'key3'  => $value3,
			)
		),
		 // INDEXES | TOTAL | NONE
		'ReturnConsumedCapacity' => 'TOTAL',
        // NONE | ALL_OLD | UPDATED_OLD | ALL_NEW | UPDATED_NEW
       'ReturnValues' => 'ALL_NEW',        
        // SIZE | NONE
       'ReturnItemCollectionMetrics' => 'SIZE', 
	)
);

```

### ReturnConsumedCapacity

| 値          |   説明      |
|:------------|------------:|
| NONE | (デフォルト値) 何も返さない    |
| TOTAL   | テーブルとインデックス両方で消費されたキャパシティのトータルを返す      |
| INDEXES   | インデックスで消費されたキャパシティのみ返す |

キャパシティはread capacity unitsのこと。多分。

### ReturnItemCollectionMetrics

| 値          |   説明      |
|:------------|------------:|
| NONE | (デフォルト値) 何も返さない    |
| SIZE |  操作中に変更されたアイテムのコレクションがあれば、統計情報が返されます。 |


## データの更新 / DynamoDbClient#updateItem

http://docs.aws.amazon.com/aws-sdk-php/latest/class-Aws.DynamoDb.DynamoDbClient.html#_updateItem

```php
<?php

use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Enum\Type;
use Aws\DynamoDb\Enum\AttributeAction;
use Aws\DynamoDb\Enum\ReturnValue;


$result = $dynamo->updateItem(array(
    "TableName" => 'table_name',
    "Key" => array(
        "Id" => array(Type::NUMBER => 121)
    ),
    "AttributeUpdates" => array(
        "NewAttribute" => array(
            "Value" => array(Type::STRING => "Some Value")
        ),
        "Authors" => array(
            "Action" => AttributeAction::ADD,
            "Value" => array(Type::STRING_SET => array("Author YY", "Author ZZ"))
        )
    ),
    "ReturnValues" => ReturnValue::ALL_NEW
));
```

### パラメータ：Action (ADD | PUT | DELETEが指定可能)
 * ADD: 
  * 属性が既に存在しない場合、属性とその値がアイテムに追加される。
  * 属性が存在する場合は、属性のデータ型によって動作が異なる。
     * 既存の属性がnumberで 値もnumberの場合、加算される。
     * 既存の属性がセット型で、値もセットの場合、追加される。

 * PUT: 
  * アイテムに指定された属性を追加。属性が既に存在する場合は、新しい値に置き換えられる。
 * DELETE:
   * 値を指定しない場合、属性とその値をアイテムから除去される。
   * 指定された値のデータ型は、既存の値のデータ型と一致する必要がある。 
   * 値にセット型が指定されている場合、それらの値は、古いセットから減算される。たとえば、[A、B、C]という値が設定されていた場合に、[A、C]の削除アクションを実行すると、結果は[B]になる。空のセットを指定するとエラー。

### パラメータ：Expected

期待する値を持っているかチェックできるぽい。詳細は不明

### パラメータ：ReturnValues

| 値          |   説明      |
|:------------|------------:|
| NONE        | (デフォルト値) 何も返さない    |
| ALL_OLD     | 古い属性値すべてを返す        |
| UPDATED_OLD | 更新された古い属性値のみを返す  |
| ALL_NEW     | 新しいバージョンの属性すべて返す |
| UPDATED_NEW | 更新された新しい属性値のみを返す |



## データの取得 / DynamoDbClient#getItem

```php
<?php

 $args = array(
        'TableName' => 'table_name',
        'Key' => array(
            'field1' => array('N' => '1201'),
            'field2' => array('S' => 1),
        ),
        // 'AttributesToGet' => array('string', ... ),
        'ConsistentRead' => true,
        //'ReturnConsumedCapacity' => 'string',
 );
 $result = $client->getItem($args);
```

### パラメータ：ConsistentRead

| 値     |   説明      |
|:-----------|------------:|
| true | 強く一貫した読み取り |
| false | （デフォルト）結果的な読取り一貫性|

### パラメータ：AttributesToGet

属性を指定した場合、指定した属性のみ返す。指定しなかった場合はすべて返す。
select * と、select field1, field2 from table の違いみたいな感じ。


## データの検索 / DynamoDbClient#query


### レスポンス: LastEvaluatedKey
Limitを指定した場合か、結果セットが1MBを超えた場合にのみ返される。
続きのデータを取得したい場合は、LastEvaluatedKey の値を ExclusiveStartKeyに指定して再度queryする。



# メモ／比較演算子

| 演算子      |   説明      |
|:-----------|------------:|
| EQ | 等しい |
| LE | 以下 (Less than or equal)|
| LT | 未満 (Less than) |
| GE | 以上 (Greater than or equal)|
| GT | より大きい (Greater than) |
| BEGINS_WITH | 〜で始まる |
| BETWEEN|A〜Bの間 (AとBは含む)|



## DynamoDbClientの便利メソッド(Dynamo形式のデータ型に変換)

https://github.com/aws/aws-sdk-php/blob/master/src/Aws/DynamoDb/DynamoDbClient.php

※ 注意：2014/11/09追記

このメソッドは、DynamoDBがjsonをサポートしたのに伴い、deprecated になっています。 
(see https://github.com/aws/aws-sdk-php/blob/master/src/Aws/DynamoDb/DynamoDbClient.php#L155)


```php
<?php

$attrs = array(
	”name" => "my_name",
    "age" => 30,
);

$res = $client->formatAttributes($attrs, $format = Aws\DynamoDb\Attribute::FORMAT_PUT);

print_r($res);
```

結果: 

```
Array
(
    [name] => Array
        (
            [S] => my_name
        )

    [age] => Array
        (
            [N] => 30
        )

)

```

$format は下記が指定可能

* Aws\DynamoDb\Attribute::FORMAT_PUT (put)
* Aws\DynamoDb\Attribute::FORMAT_UPDATE (update)
* Aws\DynamoDb\Attribute::FORMAT_EXPECTED (expected)

update, expected は下記のような形式になる。
形式が違ってめんどくさいよね…


```
Array
(
    [name] => Array 
        (
            [Value] => Array
                (
                    [S] => my_name
                )
    [age] => Array 
        (
            [Value] => Array
                (
                    [N] => 30
                )

)
```




# putItem と updateItem の違い

* putItemはレコード全体を指定したkey,valueで置き換える
* updateItem は、レコードの一部のkey, valueを置き換えらえる
* updateItem は、ADD, PUT, DELETE のアクションが行える。

# putItem と updateItem の同じ部分

* どちらも、新規登録、更新ができる