AWS.DynamoDB.DocumentClient を使用して DynamoDB からデータを取得する操作する方法を紹介します。
動作環境は AWS Lambda Node.js 10.X で確認しています。
データを1件取得する
次のテーブルから"マイケルジャクソン"の"スリラー"を取得
テーブル名:Music
プライマリパーティションキー:Artist プライマリソートキー:SongTitle
コード
var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: "ap-northeast-1" }); exports.handler = async(event) => { var params = { TableName: 'Music', Key: { 'Artist': 'マイケルジャクソン', 'SongTitle': 'スリラー' } }; var result; try { result = await documentClient.get(params).promise(); } catch (e) { result = e; } return { statusCode: 200, body: result, }; };
結果
{ "Item": { "Artist": "マイケルジャクソン", "ReleaseDate": "1982/12/01", "SongTitle": "スリラー" } }
キーを指定して1件だけ取得する場合に"get"メソッドを使います。
プライマリソートキーがあるテーブルから取得する場合は
プライマリパーティションキーだけで一意になるとしてもプライマリソートキーの指定が必要です。
データを複数、プライマリパーティションキーで取得する
次のテーブルから"マイケルジャクソン"の曲を取得
テーブル名:Music
プライマリパーティションキー:Artist プライマリソートキー:SongTitle
コード
var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: "ap-northeast-1" }); exports.handler = async(event) => { var params = { TableName: 'Music', KeyConditionExpression: 'Artist = :Artist', ExpressionAttributeValues: { ':Artist': 'マイケルジャクソン' } }; var result; try { result = await documentClient.query(params).promise(); } catch (e) { result = e; } return { statusCode: 200, body: result, }; };
結果
{ "Items": [ { "Artist": "マイケルジャクソン", "ReleaseDate": "1982/12/01", "SongTitle": "スリラー" }, { "Artist": "マイケルジャクソン", "ReleaseDate": "1983/02/03", "SongTitle": "ビートイット" } ], "Count": 2, "ScannedCount": 2 }
プライマリパーティションキーを指定し、プライマリソートキーは指定しないで検索する場合"query"メソッドを使います。
プライマリパーティションキーの指定は必須になります。
データを複数、任意の条件で絞り込んで取得する
次のテーブルから"1983年〜1984年に発売した"曲を取得
テーブル名:Music
プライマリパーティションキー:Artist プライマリソートキー:SongTitle
コード
var AWS = require('aws-sdk'); var documentClient = new AWS.DynamoDB.DocumentClient({ apiVersion: '2012-08-10', region: "ap-northeast-1" }); exports.handler = async(event) => { var params = { TableName: 'Music', FilterExpression: 'ReleaseDate between :Start and :End', ExpressionAttributeValues: { ':Start': '1983/01/01', ':End': '1984/12/31' }, }; var result; try { result = await documentClient.scan(params).promise(); } catch (e) { result = e; } return { statusCode: 200, body: result, }; };
結果
{ "Items": [ { "Artist": "マドンナ", "ReleaseDate": "1984/11/12", "SongTitle": "ライクアヴァージン" }, { "Artist": "マイケルジャクソン", "ReleaseDate": "1983/02/03", "SongTitle": "ビートイット" } ], "Count": 2, "ScannedCount": 4 }
データを全件取得する場合、"scan"メソッドを使用します。
今回はプライマリパーティションキーでもプライマリソートキーでもない"ReleaseDate"でフィルタリングしたかったため"FilterExpression"というパラメーターを追加して"scan"を実行しました。
これだけだと"scan"と"FilterExpression"があれば他のメソッドは不要に思えますが、"FilterExpression"はデータを一旦取得した後でフィルタリングしています。
なので処理速度も遅く、AWSのデータ転送料金も全データ取得した分かかってしまうので注意が必要です。
なお、"FilterExpression"は"query"メソッドでも使用できます。