DocumentClient を使用して DynamoDB からデータを取得

AWS.DynamoDB.DocumentClient を使用して DynamoDB からデータを取得する操作する方法を紹介します。

動作環境は AWS Lambda Node.js 10.X で確認しています。

 

データを1件取得する

次のテーブルから"マイケルジャクソン"の"スリラー"を取得

テーブル名:Music

プライマリパーティションキー:Artist プライマリソートキー:SongTitle

DynamoDB からデータを取得

コード

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

DynamoDB からデータを取得

コード

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

DynamoDB からデータを取得 コード

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"メソッドでも使用できます。

 

 

 

アプリケーション開発バナー