maemaewaterの日記

PHP/Python/JavaScript/C#/C++などによるプログラムに関することを主に書いています。

Amazon DynamoDBのLocal Secondary Indexesとaws-sdk-php2/2.3.0

Amazon DynamoDBで新しく追加されたLocal Secondary Indexesを使用しようと思ってドキュメントを読んでいたらQueryの書き方が変わっていました。
微妙に変わっているので、見間違えかと思いましたが確かに変わっておりました。今回は、Queryの使い方とLocal Secondary Indexを使用した例の紹介です。インデックスが設定できるようになって良かったなと思っています。

まず初めにLocal Secondary Indexesを利用するにはaws-sdk-phpを新しくインストールします。

sudo pear install aws/sdk

Local Secondary Indexesを使用する前に、Queryの方法が変わっているので新しいバージョンでの使用方法は以下の通りです(test_rという名前のテーブルにidというキーがある場合に対しての例)。

<?php
require_once 'AWSSDKforPHP/aws.phar';

use Aws\Common\Aws;

$aws = Aws::factory('(...)/config.php');

$ddb = $aws->get('dynamodb');

...

$query_result = $ddb->query(array(
        'TableName' => 'test_r',
        'KeyConditions' => array(
                'id' => array(
                        'ComparisonOperator' => 'EQ',
                        'AttributeValueList' => array(
                                array(
                                        'S' => 'test_data'
                                )
                        )
                )
        )

    )
);
print_r($query_result["Items"]);
?>

KeyConditionsでキーの名前を指定するように変更されています。次に、Local Secondary Indexを使用する例です。Local Secondary Indexは、あらかじめテーブルを作成しておく時に設定しておきます。ここでは、modified-indexという名前でmodifiedという列にLocal Secondary Indexを設定してあります。この例では、test_r2という名前のテーブルに対して処理しています。

<?php
require_once 'AWSSDKforPHP/aws.phar';

use Aws\Common\Aws;

$aws = Aws::factory('(...)/config.php');
$ddb = $aws->get('dynamodb');

$query_result = $ddb->query(array(
        'TableName' => 'test_r2',
        'IndexName' => 'modified-index',

        'KeyConditions' => array (
                "id" => array(
                                'ComparisonOperator' => 'EQ',
                                'AttributeValueList' => array(
                                        array(
                                                'S' => 'test_data'
                                        )
                                )
                ),
                "modified" => array(
                        "ComparisonOperator" => "BETWEEN",
                        "AttributeValueList" => array(
                                array('S' => "2012-01-01 00:00:00"),
                                array('S' => "2013-04-21 00:00:00")                                                                                       
                        )
                )
        ),

        "AttributesToGet" => array("id", "modified"),
        "ConsistentRead" => false
    )
);
print_r($query_result["Items"]);
?>

IndexNameでインデックス名を指定して、後は通常のQueryと同じよう書けば大丈夫です。

参考にさせていただいたページ: