DynamoDB 入門編 2

記事タイトルとURLをコピーする
こんにちは。開発グループの坂本です。 今回も前回の「DynamoDB 入門編」に続き、「DynamoDB」のクエリをみていきたいと思います。
前回のPut、Get、Scanに続いて今回確認するクエリは、「Query」です。 目次
  1. 今回利用するテーブルの確認
  2. Query
  3. 比較演算子
  4. BETWEEN
  5. BEGINS_WITH
  6. ソート
  7. まとめ
  1. 今回利用するテーブルの確認 今回は「成績表Report_Card)」テーブルを作成して操作してみたいと思います。
学生ID「Studentid」とテスト日「Date」を「Primary Key」にし、数学、国語、理科、社会のテストの点数を「Attribute」に入れました。
「Report_Card」テーブル
StudentidDateMathReadingScienceSocial
1"2012-09-10"90809085
2"2012-09-10"60657560
1"2012-12-10"65908580
2"2012-12-10"80506555
1"2013-03-10"55809075
1"2013-06-10"70856080
  2. QueryQuery」ではハッシュキーとレンジキーを使って「Item」を絞り込むことができます。 ハッシュキーはイコール指定で、レンジキーの方で比較演算子やBETWEENを使って「Item」を絞り込むイメージです。
それでは、どういった絞り込みができるか実際に試してみたいと思います。
3. 比較演算子 まずは、比較演算子を使って絞り込んでみます。比較演算子として以下の表のものが使えます。
EQ等しい (Equal.)
LE以下 (Less than or equal.)
LTより小さい (Less than.)
GE以上 (Greater than or equal.)
GTより大きい (Greater than.)
以下のようなコードを実行して結果を確認していきます。 /home/ec2-user/dynamo_query_le.php
require 'AWSSDKforPHP/aws.phar';

use AwsCommonAws;
use AwsDynamoDbExceptionDynamoDbException;

$aws = Aws::factory('/usr/share/pear/AWSSDKforPHP/Aws/Common/Resources/aws-config.php');

try {
    $client = $aws->get('dynamodb');

    $iterator = $client->getIterator('Query', array(
        'TableName'     => 'Report_Card',
        'KeyConditions' => array(
            'studentid' => array(
                'AttributeValueList' => array(
                    array('N' => '1')
                ),
                'ComparisonOperator' => 'EQ'
            ),
            'date' => array(
                'AttributeValueList' => array(
                    array('S' => '2013-03-10')
                ),
                'ComparisonOperator' => 'LE'
            )
        )
    ));

foreach ($iterator as $item) {
    echo "テスト日:" . $item['date']['S'] . " ";
    echo "数学:" . $item['Math']['N'] . "点" . "n";
}

} catch (DynamoDbException $e) {
    echo 'NG';
}
ComparisonOperator」に利用する比較演算子を指定します。ハッシュキーは常に「EQ(等しい)」指定で、レンジキーの「ComparisonOperator」の指定を変更することで欲しい結果を絞ります。
今回は「LE(以下)」を指定しました。
実行します。
php /home/ec2-user/dynamo_query_le.php
実行結果

テスト日:2012-09-10 数学:90点
テスト日:2012-12-10 数学:65点
テスト日:2013-03-10 数学:55点
学生IDが1番の人の2013年3月10日以前の数学のテストの結果を取得できました。
4. BETWEEN 続いて、「BETWEEN」を使ってテスト日が2012年12月10日から2013年6月10日の「Item」を絞り込んでみます。 /home/ec2-user/dynamo_query_between.php
省略
    $iterator = $client->getIterator('Query', array(
        'TableName'     => 'Report_Card',
        'KeyConditions' => array(
            'studentid' => array(
                'AttributeValueList' => array(
                    array('N' => '1')
                ),
                'ComparisonOperator' => 'EQ'
            ),
            'date' => array(
                'AttributeValueList' => array(
                    array('S' => '2012-12-10'),
                    array('S' => '2013-06-10')
                ),
                'ComparisonOperator' => 'BETWEEN'
            )
        )
    ));
省略
BETWEEN」の場合は「AttributeValueList」に配列を一つ足して、どこからどこまでの間なのかを指定します。 実行します。
php /home/ec2-user/dynamo_query_between.php
実行結果

テスト日:2012-12-10 数学:65点
テスト日:2013-03-10 数学:55点
テスト日:2013-06-10 数学:70点

5. BEGINS_WITHBEGINS_WITH」を使ってテスト日が2013年の「Item」だけ絞り込みます。 /home/ec2-user/dynamo_query_begins_with.php
省略
    $iterator = $client->getIterator('Query', array(
        'TableName'     => 'Report_Card',
        'KeyConditions' => array(
            'studentid' => array(
                'AttributeValueList' => array(
                    array('N' => '1')
                ),
                'ComparisonOperator' => 'EQ'
            ),
            'date' => array(
                'AttributeValueList' => array(
                    array('S' => '2013')
                ),
                'ComparisonOperator' => 'BEGINS_WITH'
            )
        )
    ));
省略
実行します。
php /home/ec2-user/dynamo_query_begins_with.php
実行結果

テスト日:2013-03-10 数学:55点
テスト日:2013-06-10 数学:70点
テスト日:2013-09-10 数学:50点

6. ソート デフォルトは昇順ですが、「ScanIndexForward」を足して指定を「false」にすると、降順に並べ替えることができます。 /home/ec2-user/dynamo_query_begins_with2.php
省略
    $iterator = $client->getIterator('Query', array(
        'TableName'     => 'Report_Card',
        'KeyConditions' => array(
            'studentid' => array(
                'AttributeValueList' => array(
                    array('N' => '1')
                ),
                'ComparisonOperator' => 'EQ'
            ),
            'date' => array(
                'AttributeValueList' => array(
                    array('S' => '2013')
                ),
                'ComparisonOperator' => 'BEGINS_WITH'
            )
        ),
        'ScanIndexForward' => false,
    ));
省略
実行します。
php /home/ec2-user/dynamo_query_begins_with2.php
実行結果

テスト日:2013-09-10 数学:50点
テスト日:2013-06-10 数学:70点
テスト日:2013-03-10 数学:55点
一つ前に確認した「BEGINS_WITH」の結果がテスト日の降順に並び替わりました。
7. まとめ 今回は、「Query」を使った「Item」の絞り込み方法を確認してみました。
SQLのような絞り込みではないですが、今回のようにレンジキーに日付や時刻を入れて時間で絞りこむような場合は、いろいろと使える用途があるのではないでしょうか。

次回は、「BatchGetItem」というクエリを試してみたいと思います。