PHP
AWS
DynamoDB

DynamoDBメモ (+PHP SDK2)

More than 3 years have passed since last update.

データ型

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

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

<?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

$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

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

 $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

$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 の同じ部分

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