AWSのLambda(Node.js)からDynamoDBに対していろんな条件指定でQueryしてみる
AWSのLambda(Node.js)からDynamoDBのデータをパーティションキーとソートキーで条件指定して取得します。
パーティションキー(pk)は1つの値を指定する必要がありますが、ソートキーで様々な条件付けを行えます。
Query以外のPutItem, Scan, UpdateItem, DeleteItem等行いたい場合はこちらの記事を参照してください。
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);
}
});
});
}
ディスカッション
コメント一覧
まだ、コメントがありません