##はじめに
はじめまして、Qiita初投稿です。これからも不定期に投稿していければと思っています。
私自身エンジニア(3年目)として学習中の身のため、内容に誤り等があればご指摘いただけますと幸いです。
本投稿ではAmazon DynamoDBからデータを取得する方法について書いていきます。
##DynamoDBについて
取得方法について書く前に、そもそもDynamoDBについて簡単に説明します。
DynamoDBはAWSサービスのひとつであるフルマネージド型NoSQLデータベースサービスです[1]。
NoSQL(非SQL)なので、OracleやMySQLのようにデータ取得の際に柔軟なクエリを使用することはできません。(SQLのように扱うためのモジュールもあるようです[2])
テーブル作成時にはパーティションキー、もしくはパーティションキーとソートキーを定義するだけであり、他の属性を事前に定義する必要はなく拡張性に優れるというのも特徴のひとつです。
##取得方法
DynamoDBのテーブルからデータを取得するには、以下の方法があります。
-
scan
データを全件取得する -
query
条件式に一致するデータを取得する -
batchGetItem
単一もしくは複数テーブルから複数の項目を取得する
今回は上記scanを用いた場合の、Node.jsでの実装方法を記載します。
##実装
AWSのSDKを用いて実装します。
事前にnpmコマンドでSDKをインストールします。
npm install -s aws-sdk
以下が、scanを用いたデータ取得のサンプルです。
DynamoDBに事前にテーブルを作成しておけば、Lambda上でそのまま実行できます。
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
exports.handler = function (event, context) {
const TABLE_NAME = 'SampleTable';
// DynamoDB scanで必要なパラメータ
let params = {
TableName : TABLE_NAME, // テーブル名
};
// scanの実行(非同期で実行され、コールバックで結果を受ける)
docClient.scan(params, function(err, data) {
if (err) {
// エラー時の処理を記述
console.log("エラー = " + err);
} else {
// 成功時の処理を記述(取得結果はdataに格納される)
console.log("成功 = " + JSON.stringify( data ));
data.Items.forEach(dt => {
console.log('id : ' + dt.id);
console.log('name : ' + dt.name);
});
}
});
};
上記サンプルではSampleTableという名前のテーブルのデータを全件取得して、データをログに出力するというだけの単純なものです。
※SampleTableにはid(パーティションキー)とnameという項目がある前提です。
###レスポンス
上記コードを実行した際のレスポンスのサンプルです。
{
"Items":[
{
"id":"id1",
"name":"hoge"
},
{
"id":"id2",
"name":"moge"
}
],
"Count":2,
"ScannedCount":2
}
Itemsにscanの結果がレコードごとに配列に格納されます。
Countに取得件数(フィルタ後)が、ScannedCountにscanで取得した件数(全量)が格納されます。
##さいごに
簡単にではありますが、DynamoDBをNode.jsを使ってデータ取得する方法について書いてきました。より詳しく知りたい方はDynamoDBの公式ドキュメントを参照ください。パラメータにフィルタを設定したり、取得件数の上限を指定したりなどもできます。
DynamoDBのまだまだごく一部しか理解できていないので、これからもいろいろ試しながら理解を深めていこうと思います。
##参考サイト
[1]AWS DynamoDB公式ドキュメント
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Introduction.html
[2]DynamoDBをSQLで操作するNodeモジュール
https://takamints.hatenablog.jp/entry/operating-the-dynamodb-by-SQL-ish-language