AWSのLambda(Node.js)からDynamoDBに対していろんな条件指定でQueryしてみる

2021-04-15

AWSのLambda(Node.js)からDynamoDBのデータをパーティションキーとソートキーで条件指定して取得します。
パーティションキー(pk)は1つの値を指定する必要がありますが、ソートキーで様々な条件付けを行えます。
Query以外のPutItem, Scan, UpdateItem, DeleteItem等行いたい場合はこちらの記事を参照してください。

  1. Queryの基本形
  2. ソートキーによる検索条件追加
  3. 例:ある場所の指定期間のデータを取得
  4. 参考

1. Queryの基本形

以下はパーティションキー(pk)のみを指定してデータを取得する方法です。
function dynamo_queryの中の検索条件(KeyConditionExpression)を変更することで様々な条件指定ができます。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let res= await dynamo_query();//Queryの実行
    
    return res;
};

function dynamo_query(){
    return new Promise((resolve, reject) => {
        let params = {
            "TableName": "TableName",//テーブル名
            "KeyConditionExpression": "#pk_name = :pk_prm",//検索条件
            "ExpressionAttributeNames":{
                "#pk_name": "pk_name",//pkの名称
            },
            "ExpressionAttributeValues": {
                ":pk_prm": "pk_prm",//取得したいpkの値
            }
        };
        dynamo.query(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve(data.Items);
            }
        });
    });
}

2. ソートキーによる検索条件追加

ソートキー(sk)の条件も指定する場合は、KeyConditionExpressionにANDを使用してパーティションキーとソートキーの条件と組み合わせます。

//pk=pk_prmのデータ取得
"#pk_name = :pk_prm"

//pk=pk_prmかつsk=sk_prmのデータ取得
"#pk_name = :pk_prm AND #sk_name = :sk_prm"

//pk=pk_prmかつsk<sk_prmのデータ取得
"#pk_name = :pk_prm AND #sk_name < :sk_prm"

//pk=pk_prmかつsk<=sk_prmのデータ取得
"#pk_name = :pk_prm AND #sk_name <= :sk_prm"

//pk=pk_prmかつsk>sk_prmのデータ取得
"#pk_name = :pk_prm AND #sk_name > :sk_prm"

//pk=pk_prmかつsk>=sk_prmのデータ取得
"#pk_name = :pk_prm AND #sk_name >= :sk_prm"

//pk=pk_prmかつsk_prm1<=sk<=sk_prm2のデータ取得
"#pk_name = :pk_prm AND #sk_name BETWEEN :sk_prm1 AND BETWEEN :sk_prm2"

//pk=pk_prmかつskがsk_prmから始まるデータ取得
"#pk_name = :pk_prm AND begins_with (#sk_name, :sk_prm )"

3. 例:ある場所の指定期間のデータを取得

pkが場所(place)でskに日時(datetime)を設定したDynamoDBテーブルから、香川県のある期間におけるデータを取得してみます。
期間をしていするため、KeyConditionExpressionにBETWEENを使いました。

var aws = require('aws-sdk');
var dynamo = new aws.DynamoDB();

exports.handler = async (event) => {

    let res= await dynamo_query();//Queryの実行
    
    return res;
};

function dynamo_query(){
    return new Promise((resolve, reject) => {
        let params = {
            "TableName": "TableName",//テーブル名
            "KeyConditionExpression": "#pk_name = :pk_prm AND #sk_name BETWEEN :sk_prm1 AND :sk_prm2",
            "ExpressionAttributeNames":{
                "#pk_name": "place",
                "#sk_name": "datetime",
            },
            "ExpressionAttributeValues": {
                ":pk_prm": "kagawa",
                ":sk_prm1": "2021/03/10T00:00",
                ":sk_prm2": "2021/03/13T12:00",
            }
        };
        dynamo.query(params,function(err, data) {
            if (err) {
                reject(err, err);
            } else {
                resolve(data.Items);
            }
        });
    });
}

参考