メニュー
Amazon DynamoDB
開発者ガイド (API Version 2012-08-10)

ステップ 4: データをクエリおよびスキャンする

query メソッドを使用して、テーブルからデータを取得できます。パーティションキーの値を指定する必要があります。ソートキーはオプションです。

Movies テーブルのプライマリキーは、以下の内容で構成されます。

  • year – パーティションキー。属性タイプは数値です。 

  • title – ソートキー。属性タイプは文字列です。

1 年間にリリースされたすべての映画を検索するには、year のみ指定する必要があります。title を指定して、いくつかの条件 (ソートキー上) に基づいて映画のサブセットを取得することもできます。たとえば、2014 年にリリースされて、主題が「A」で始まる映画を探す場合です。

query に加えて、すべてのテーブルデータを取得可能な scan メソッドもあります。

データのクエリとスキャンの詳細については、「クエリの操作」と「スキャンの使用」をそれぞれ参照してください。

ステップ 4.1: クエリ - 1 年間にリリースされたすべての映画

このステップに含まれているプログラムは、year 1985 にリリースされたすべての映画を取得します。

  1. 次のプログラムを MoviesQuery01.php というファイルにコピーアンドペーストします。

    Copy
    <?php require 'vendor/autoload.php'; date_default_timezone_set('UTC'); use Aws\DynamoDb\Exception\DynamoDbException; use Aws\DynamoDb\Marshaler; $sdk = new Aws\Sdk([ 'endpoint' => 'http://localhost:8000', 'region' => 'us-west-2', 'version' => 'latest' ]); $dynamodb = $sdk->createDynamoDb(); $marshaler = new Marshaler(); $tableName = 'Movies'; $eav = $marshaler->marshalJson(' { ":yyyy": 1985 } '); $params = [ 'TableName' => $tableName, 'KeyConditionExpression' => '#yr = :yyyy', 'ExpressionAttributeNames'=> [ '#yr' => 'year' ], 'ExpressionAttributeValues'=> $eav ]; echo "Querying for movies from 1985.\n"; try { $result = $dynamodb->query($params); echo "Query succeeded.\n"; foreach ($result['Items'] as $movie) { echo $marshaler->unmarshalValue($movie['year']) . ': ' . $marshaler->unmarshalValue($movie['title']) . "\n"; } } catch (DynamoDbException $e) { echo "Unable to query:\n"; echo $e->getMessage() . "\n"; } ?>

    注記

    • ExpressionAttributeNames は、名前を置換します。year は DynamoDB の予約語であるため、これが使用されます。KeyConditionExpression を含むどの式でも直接使用することはできません。これに対処するため、式の属性名 #yr を使用できます。

    • ExpressionAttributeValues は、値を置換します。KeyConditionExpression を含むどの式にもリテラルを使用できないため、これを使用します。これに対処するため、式の属性値 :yyyy を使用できます。

  2. このプログラムを実行するには、次のコマンドを入力します。

    php MoviesItemQuery01.php

注記

前のプログラムは、プライマリキーの属性によってテーブルをクエリする方法を示しています。DynamoDB では、必要に応じて 1 つ以上のセカンダリインデックスをテーブルに作成し、テーブルをクエリするのと同じ方法でそれらのインデックスをクエリできます。セカンダリインデックスは非キー属性のクエリを可能にすることで、アプリケーションに追加の柔軟性を提供します。詳細については、「セカンダリインデックスを使用したデータアクセス性の向上」を参照してください。

ステップ 4.2: クエリ - 1 年間にリリースされた特定のタイトルを持つすべての映画

このステップに含まれているプログラムは、year 1992 にリリースされたすべての映画のうち、title が「A」~「L」で始まる映画を取得します。

  1. 次のプログラムを MoviesQuery02.php というファイルにコピーアンドペーストします。

    Copy
    <?php require 'vendor/autoload.php'; date_default_timezone_set('UTC'); use Aws\DynamoDb\Exception\DynamoDbException; use Aws\DynamoDb\Marshaler; $sdk = new Aws\Sdk([ 'endpoint' => 'http://localhost:8000', 'region' => 'us-west-2', 'version' => 'latest' ]); $dynamodb = $sdk->createDynamoDb(); $marshaler = new Marshaler(); $tableName = 'Movies'; $eav = $marshaler->marshalJson(' { ":yyyy":1992, ":letter1": "A", ":letter2": "L" } '); $params = [ 'TableName' => $tableName, 'ProjectionExpression' => '#yr, title, info.genres, info.actors[0]', 'KeyConditionExpression' => '#yr = :yyyy and title between :letter1 and :letter2', 'ExpressionAttributeNames'=> [ '#yr' => 'year' ], 'ExpressionAttributeValues'=> $eav ]; echo "Querying for movies from 1992 - titles A-L, with genres and lead actor\n"; try { $result = $dynamodb->query($params); echo "Query succeeded.\n"; foreach ($result['Items'] as $i) { $movie = $marshaler->unmarshalItem($i); print $movie['year'] . ': ' . $movie['title'] . ' ... '; foreach ($movie['info']['genres'] as $gen) { print $gen . ' '; } echo ' ... ' . $movie['info']['actors'][0] . "\n"; } } catch (DynamoDbException $e) { echo "Unable to query:\n"; echo $e->getMessage() . "\n"; } ?>
  2. このプログラムを実行するには、次のコマンドを入力します。

    php MoviesQuery02.php

ステップ 4.3: スキャン

scan メソッドは、テーブル全体のすべての項目を読み込み、テーブルの全データを返します。オプションで filter_expression を提供して、条件に一致する項目だけが返されるように指定できます。ただし、テーブル全体がスキャンされた後にのみ、フィルタが適用されます。

次のプログラムは、約 5,000 項目を含む Movies テーブル全体をスキャンします。スキャンは、1950 年代の映画のみ (約 100 項目) を取得して、残りはすべて破棄するようオプションのフィルタを指定します。

  1. 次のプログラムを MoviesScan.php というファイルにコピーアンドペーストします。

    Copy
    <?php require 'vendor/autoload.php'; date_default_timezone_set('UTC'); use Aws\DynamoDb\Exception\DynamoDbException; use Aws\DynamoDb\Marshaler; $sdk = new Aws\Sdk([ 'endpoint' => 'http://localhost:8000', 'region' => 'us-west-2', 'version' => 'latest' ]); $dynamodb = $sdk->createDynamoDb(); $marshaler = new Marshaler(); //Expression attribute values $eav = $marshaler->marshalJson(' { ":start_yr": 1950, ":end_yr": 1959 } '); $params = [ 'TableName' => 'Movies', 'ProjectionExpression' => '#yr, title, info.rating', 'FilterExpression' => '#yr between :start_yr and :end_yr', 'ExpressionAttributeNames'=> [ '#yr' => 'year' ], 'ExpressionAttributeValues'=> $eav ]; echo "Scanning Movies table.\n"; try { while (true) { $result = $dynamodb->scan($params); foreach ($result['Items'] as $i) { $movie = $marshaler->unmarshalItem($i); echo $movie['year'] . ': ' . $movie['title']; echo ' ... ' . $movie['info']['rating'] . "\n"; } if (isset($result['LastEvaluatedKey'])) { $params['ExclusiveStartKey'] = $result['LastEvaluatedKey']; } else { break; } } } catch (DynamoDbException $e) { echo "Unable to scan:\n"; echo $e->getMessage() . "\n"; } ?>

    このコードでは、以下の点に注意してください。

    • ProjectionExpression は、スキャン結果に必要な属性を指定します。

    • FilterExpression は、条件を満たした項目だけが返されるような条件を指定します。他のすべての項目は破棄されます。

  2. このプログラムを実行するには、次のコマンドを入力します。

    php MoviesScan.php

注記

テーブルで作成した任意のセカンダリインデックスで Scan オペレーションを使用することもできます。詳細については、「セカンダリインデックスを使用したデータアクセス性の向上」を参照してください。