テーブルから複数項目を取得したい場合、queryを使う方法以外にscanを使用することもできます。
今回はscanを実行し、項目を複数取得します。
スキャン
スキャンはプライマリキーの指定は必要ありません。
スキャンの処理としては指定したテーブルから全ての項目を取得して、項目取得に条件が指定されている場合、条件に一致する項目のみを取得します。
テーブルの内容
Musicsというテーブルに対してスキャンを実行します。
テーブルの内容は以下の通りです。
artist: パーテションキー
title: ソートキー
スキャンの実行
実行
artist名が “B” から始まり、かつ、title が “IN” から始まる項目を取得します。
Lambda関数の内容は以下の通りです。
const DynamoDbSetter = require("./DynamoDbSetter");
module.exports = class DynamoDbOperator extends DynamoDbSetter{
async exec(event) {
// 実行内容
let params = {
TableName : "Musics",
FilterExpression: "begins_with(#artist, :artistValue) AND begins_with(#title, :titleValue)",
ExpressionAttributeNames: {
"#artist": "artist",
"#title": "title",
},
ExpressionAttributeValues: {
":artistValue": {"S": "B"},
":titleValue": {"S": "IN"},
},
ReturnConsumedCapacity: "INDEXES"
};
// 実行
return await this.dynamodb.scan(params).promise();
}
}
実行内容の説明
FilterExpression
項目を取得する条件を指定します。
begins_with により前方一致検索が可能です。
AND や OR により条件を複数指定できます。
結果
{
"Items": [
{
"year": {
"N": "1991"
},
"artist": {
"S": "B'z"
},
"genre": {
"S": "Lock"
},
"title": {
"S": "IN THE LIFE"
}
}
],
"Count": 1,
"ScannedCount": 5,
"ConsumedCapacity": {
"TableName": "Musics",
"CapacityUnits": 0.5,
"Table": {
"CapacityUnits": 0.5
}
}
}
ScannedCount が 5 になっているので、5項目が取得されたことになります。Count が1なので条件に一致する項目が1つあったことになります。
キャパシティーユニット
スキャンはテーブルから全ての項目を取得した後に、条件に一致する項目のみを取得します。
消費されるキャパシティーユニットの計算は、条件に一致した項目ではなく、テーブルから取得した全ての項目のサイズが使用されます。
スキャンはあくまでもテーブルの項目全てを取得するということです。
最後に
次回はDynamoDBが項目の有効期限を判断して自動的に項目を削除する事を確認します。