こんにちは。開発グループの坂本です。
今回も前回の「DynamoDB 入門編」に続き、「DynamoDB」のクエリをみていきたいと思います。
前回のPut、Get、Scanに続いて今回確認するクエリは、「Query」です。 目次 1. 今回利用するテーブルの確認 今回は「成績表(Report_Card)」テーブルを作成して操作してみたいと思います。
学生ID「Studentid」とテスト日「Date」を「Primary Key」にし、数学、国語、理科、社会のテストの点数を「Attribute」に入れました。
2. Query
「Query」ではハッシュキーとレンジキーを使って「Item」を絞り込むことができます。
ハッシュキーはイコール指定で、レンジキーの方で比較演算子やBETWEENを使って「Item」を絞り込むイメージです。
それでは、どういった絞り込みができるか実際に試してみたいと思います。
3. 比較演算子 まずは、比較演算子を使って絞り込んでみます。比較演算子として以下の表のものが使えます。
以下のようなコードを実行して結果を確認していきます。
/home/ec2-user/dynamo_query_le.php
今回は「LE(以下)」を指定しました。
実行します。
4. BETWEEN 続いて、「BETWEEN」を使ってテスト日が2012年12月10日から2013年6月10日の「Item」を絞り込んでみます。 /home/ec2-user/dynamo_query_between.php
5. BEGINS_WITH 「BEGINS_WITH」を使ってテスト日が2013年の「Item」だけ絞り込みます。 /home/ec2-user/dynamo_query_begins_with.php
6. ソート デフォルトは昇順ですが、「ScanIndexForward」を足して指定を「false」にすると、降順に並べ替えることができます。 /home/ec2-user/dynamo_query_begins_with2.php
7. まとめ 今回は、「Query」を使った「Item」の絞り込み方法を確認してみました。
SQLのような絞り込みではないですが、今回のようにレンジキーに日付や時刻を入れて時間で絞りこむような場合は、いろいろと使える用途があるのではないでしょうか。
前回のPut、Get、Scanに続いて今回確認するクエリは、「Query」です。 目次 1. 今回利用するテーブルの確認 今回は「成績表(Report_Card)」テーブルを作成して操作してみたいと思います。
学生ID「Studentid」とテスト日「Date」を「Primary Key」にし、数学、国語、理科、社会のテストの点数を「Attribute」に入れました。
「Report_Card」テーブル
Studentid | Date | Math | Reading | Science | Social |
---|---|---|---|---|---|
1 | "2012-09-10" | 90 | 80 | 90 | 85 |
2 | "2012-09-10" | 60 | 65 | 75 | 60 |
1 | "2012-12-10" | 65 | 90 | 85 | 80 |
2 | "2012-12-10" | 80 | 50 | 65 | 55 |
1 | "2013-03-10" | 55 | 80 | 90 | 75 |
1 | "2013-06-10" | 70 | 85 | 60 | 80 |
それでは、どういった絞り込みができるか実際に試してみたいと思います。
3. 比較演算子 まずは、比較演算子を使って絞り込んでみます。比較演算子として以下の表のものが使えます。
EQ | 等しい (Equal.) |
LE | 以下 (Less than or equal.) |
LT | より小さい (Less than.) |
GE | 以上 (Greater than or equal.) |
GT | より大きい (Greater than.) |
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_WITH 「BEGINS_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」というクエリを試してみたいと思います。