メニュー
Amazon DynamoDB
入門ガイド (API Version 2012-08-10)

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

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

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

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

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

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

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

データのクエリとスキャンの詳細については、『Amazon DynamoDB 開発者ガイド』の「クエリおよびスキャン」を参照してください。

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

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

  1. 次のプログラムを MoviesQuery01.html というファイルにコピーします。

    Copy
    <html> <head> <script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script> <script> AWS.config.update({ region: "us-west-2", endpoint: 'http://localhost:8000', // accessKeyId default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. accessKeyId: "fakeMyKeyId", // secretAccessKey default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. secretAccessKey: "fakeSecretAccessKey" }); var docClient = new AWS.DynamoDB.DocumentClient(); function queryData() { document.getElementById('textarea').innerHTML += "Querying for movies from 1985."; var params = { TableName : "Movies", KeyConditionExpression: "#yr = :yyyy", ExpressionAttributeNames:{ "#yr": "year" }, ExpressionAttributeValues: { ":yyyy":1985 } }; docClient.query(params, function(err, data) { if (err) { document.getElementById('textarea').innerHTML += "Unable to query. Error: " + "\n" + JSON.stringify(err, undefined, 2); } else { document.getElementById('textarea').innerHTML += "Querying for movies from 1985: " + "\n" + JSON.stringify(data, undefined, 2); } }); } </script> </head> <body> <input id="queryData" type="button" value="Query" onclick="queryData();" /> <br><br> <textarea readonly id= "textarea" style="width:400px; height:800px"></textarea> </body> </html>

    注記

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

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

  2. ブラウザで MoviesQuery01.html ファイルを開きます。

  3. [Query] を選択します。

注記

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

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

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

  1. 次のプログラムを MoviesQuery02.html というファイルにコピーします。

    Copy
    <html> <head> <script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script> <script> AWS.config.update({ region: "us-west-2", endpoint: 'http://localhost:8000', // accessKeyId default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. accessKeyId: "fakeMyKeyId", // secretAccessKey default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. secretAccessKey: "fakeSecretAccessKey" }); var docClient = new AWS.DynamoDB.DocumentClient(); function queryData() { document.getElementById('textarea').innerHTML += "Querying for movies from 1985."; var params = { TableName : "Movies", ProjectionExpression:"#yr, title, info.genres, info.actors[0]", KeyConditionExpression: "#yr = :yyyy and title between :letter1 and :letter2", ExpressionAttributeNames:{ "#yr": "year" }, ExpressionAttributeValues: { ":yyyy":1992, ":letter1": "A", ":letter2": "L" } }; docClient.query(params, function(err, data) { if (err) { document.getElementById('textarea').innerHTML += "Unable to query. Error: " + "\n" + JSON.stringify(err, undefined, 2); } else { document.getElementById('textarea').innerHTML += "Querying for movies from 1992 - titles A-L, with genres and lead actor: " + "\n" + JSON.stringify(data, undefined, 2); } }); } </script> </head> <body> <input id="queryData" type="button" value="Query" onclick="queryData();" /> <br><br> <textarea readonly id= "textarea" style="width:400px; height:800px"></textarea> </body> </html>
  2. ブラウザで MoviesQuery02.html ファイルを開きます。

  3. [Query] を選択します。

ステップ 4.3: スキャン

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

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

  1. 次のプログラムを MoviesScan.html というファイルにコピーします。

    Copy
    <html> <head> <script src="https://sdk.amazonaws.com/js/aws-sdk-2.7.16.min.js"></script> <script> AWS.config.update({ region: "us-west-2", endpoint: 'http://localhost:8000', // accessKeyId default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. accessKeyId: "fakeMyKeyId", // secretAccessKey default can be used while using the downloadable version of DynamoDB. // For security reasons, do not store AWS Credentials in your files. Use Amazon Cognito instead. secretAccessKey: "fakeSecretAccessKey" }); var docClient = new AWS.DynamoDB.DocumentClient(); function scanData() { document.getElementById('textarea').innerHTML += "Scanning Movies table." + "\n"; var params = { TableName: "Movies", ProjectionExpression: "#yr, title, info.rating", FilterExpression: "#yr between :start_yr and :end_yr", ExpressionAttributeNames: { "#yr": "year", }, ExpressionAttributeValues: { ":start_yr": 1950, ":end_yr": 1959 } }; docClient.scan(params, onScan); function onScan(err, data) { if (err) { document.getElementById('textarea').innerHTML += "Unable to scan the table: " + "\n" + JSON.stringify(err, undefined, 2); } else { // Print all the movies document.getElementById('textarea').innerHTML += "Scan succeeded. " + "\n"; data.Items.forEach(function(movie) { document.getElementById('textarea').innerHTML += movie.year + ": " + movie.title + " - rating: " + movie.info.rating + "\n"; }); // Continue scanning if we have more movies (per scan 1MB limitation) document.getElementById('textarea').innerHTML += "Scanning for more..." + "\n"; params.ExclusiveStartKey = data.LastEvaluatedKey; docClient.scan(params, onScan); } } } </script> </head> <body> <input id="scanData" type="button" value="Scan" onclick="scanData();" /> <br><br> <textarea readonly id= "textarea" style="width:400px; height:800px"></textarea> </body> </html>

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

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

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

  2. ブラウザで MoviesScan.html ファイルを開きます。

  3. [Scan] を選択します。

注記

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