Node.js DynamoDB 全レコード Scan コード例

Node.js DynamoDB 全レコード Scan コード例

Node.jsを使って、 AWSDynamoDB テーブル内をスキャンする

予め、 npm init を完了させて 下↓のコマンドで aws-sdk を インストールしておきます。

npm install aws-sdk

下のコードは シンプルな Scan コード例です

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-northeast-1'
})
let DynamoDBScanAll = async () => {
    return await dynamoDB.scan({TableName: tableName}).promise()
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes.Items)
        console.log(res)
    })
})

上記コードの場合 「1 回の Scan リクエストで、最大 1 MB のデータを取得」 なので 全件数を 取得できません。

テーブル内の全レコード Scan する場合の コード例

下↓の コード例は、 LastEvaluatedKey == nullになるまで ループし スキャンを続けます。

const aws = require('aws-sdk');
const tableName = "テーブル名"
let dynamoDB = new aws.DynamoDB.DocumentClient({
    region: 'ap-southeast-2'
})
let DynamoDBScanAll = async () => {
    let ScanAll = []
    let LastEvaluatedKey = null;
    let loop = true
    try{
        while(loop){ //ループ開始
            let scanRes = {};
            let param = {TableName: tableName, ExclusiveStartKey: LastEvaluatedKey};
            scanRes = await dynamoDB.scan(param).promise() //スキャン実行
            ScanAll = ScanAll.concat(scanRes.Items) //配列結合
            LastEvaluatedKey =  (scanRes['LastEvaluatedKey'] != null) ? scanRes['LastEvaluatedKey'] : null
            if (LastEvaluatedKey == null) //LastEvaluatedKeyがnullならループ終了
                loop = false
            else
                console.log(JSON.stringify(LastEvaluatedKey))
        }
    
    } catch(e){
        console.log(e)
    }
    return ScanAll
}

Promise.all([DynamoDBScanAll()]).then((threadList) => {
    threadList.forEach(scanAllRes => {
        let res = JSON.stringify(scanAllRes)
        console.log(res)
    })
})

2回目以降のスキャンは、 scanパラメータに ExclusiveStartKeyを含め処理します。

JavaScript 値が配列(Array)かどうかを判断する

JavaScript Array.isArray

JavaScript で、 変数の値が 配列(Array)かどうかを判断する方法

let array1 = [1,2,3]; //配列を用意します。
//変数が配列かを知るにはisArrayを使います。
if (Array.isArray(array1)){
    console.log("array1は配列です")
} 

Array.isArray()の引数に、 変数を渡すと判断してくれます。

配列が空かどうか判断

先程のコードにarray1が空の場合の処理を追加します。

let array1 = []; //空の配列を用意します。
//変数が配列かを知るにはisArrayを使います。
if (Array.isArray(array1)){
    console.log("array1は配列です")
    if (array1.length == 0){
        console.log("その配列は空です。")
    }
} 

変数.lengthで値の数が確認できます。 array1のlengthは空なので0が返ります。

JSON 文字列変換とパース

JSON.stringify() parse()

JSONとは、”JavaScript Object Notation”の略らしく、難しく云うと「テキストベースのデータフォーマット」です。少し簡単に云うとExcelにはCSVと云うテキストファイルが扱いやすいですが、JSONは最近流行りのPythonJavaScriptSwiftなどから扱いやすい形式のテキストデータと云うことになります。

JSONは様々なデータ構造を作れます。Excelのような縦横のグリッド形式の場合JSONフォーマットで表すと下記のように記述することも可能です。

CSV形式をJSONで表した例
CSV形式をJSONで表した例

JavaScriptの変数をJSON文字列に変換

JavaScriptで作成した変数をJSON文字列に変換したい場合はJSON.stringify()を使います

var array1 = []; //空の配列
array1.push({"NAME": "山田", "AGE":30}); //配列追記
array1.push({"NAME": "田中", "AGE":40}); //配列追記
var jsonString = JSON.stringify(array1); //JSON文字列変換

console.log(jsonString);
JSON.stringify()結果
JSON.stringify()結果

4行目の変数jsonStringには文字列「[{“NAME”:”山田”,”AGE”:30},{“NAME”:”田中”,”AGE”:40}]」が入りました。従って、JSON形式で他者にデータを渡す場合JSON.stringify()を利用します。

JavaScriptJSON文字列をパース

「JSONをパースする」や「パーサーを使う」などの言葉をよく耳にすると思います。他者からJSON形式の文字列を受け取る場合JSONをパースし利用します。

JavaScriptJSONをパースする場合JSON.parse()を使います。使い方は簡単でJSON形式の文字列をJSON.parse()の引数に入れるだけです。

let jsonString = "[{\"NAME\":\"山田\",\"AGE\":30},{\"NAME\":\"田中\",\"AGE\":40}]";
let array2 = JSON.parse(jsonString)

変数array2は下のようにデータが入りました。

JSON.parse()結果
JSON.parse()結果