AWS

【DynamoDB】AWS SDK を使用した条件付き複数項目の取得

前回は複数項目の取得にはクエリーを使用しました。

今回もクエリーを使用します。クエリーは条件を指定して項目を取得できます。
パーテションキーは条件を指定できませんが、ソートキーに条件を指定して項目を取得することができます。

テーブルの内容

Musicsというテーブルに対してクエリーを実行します。
テーブルの内容は以下の通りです。

artist: パーテションキー
title: ソートキー

セカンダリインデックスの作成

グローバルセカンダリインデックスを作成します。
グローバルセカンダリインデックスの作成については以下を参照して下さい。

以下を実行し、グローバルセカンダリインデックスを作成します。

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        // 実行内容
        let params = {
            TableName : "Musics",
            AttributeDefinitions: [
                { AttributeName: "genre", AttributeType: "S" },
                { AttributeName: "title", AttributeType: "S" },
            ],
            GlobalSecondaryIndexUpdates: [
                {
                    Create: {
                        IndexName: "genre_title_index", 
                        KeySchema: [
                            { AttributeName: "genre", KeyType: "HASH"},  //Partition key
                            { AttributeName: "title", KeyType: "RANGE" }  //Sort key
                        ],
                        Projection: {
                            ProjectionType: "INCLUDE",
                            NonKeyAttributes: ["sngsCnt"]
                        },
                        ProvisionedThroughput: {
                            ReadCapacityUnits: 10, 
                            WriteCapacityUnits: 10
                        }
                    }
                },
            ],
        };
    
        // 実行
        return await this.dynamodb.updateTable(params).promise();
 
 
    }
}

グローバルセカンダリインデックスのプライマリキーは以下の通りです。

genre: パーテションキー
title: ソートキー

条件を指定して実行

実行

パーテションキーでクエリーを実行します。genre が “POP” で、title が “GEEN” で始まる項目を取得します。
Lambda関数の内容は以下の通りです。

const DynamoDbSetter = require("./DynamoDbSetter");
 
module.exports = class DynamoDbOperator extends DynamoDbSetter{
 
    async exec(event) {
 
        let genre = event.genre;
        let title = event.title;
        
        // 実行内容
        let params = {
            TableName : "Musics",
            IndexName: 'genre_title_index',
            KeyConditionExpression: '#genre = :genreValue AND begins_with(#title, :titleValue)',
            ExpressionAttributeNames: {
                '#genre': 'genre',
                '#title': 'title',
            },
            ExpressionAttributeValues: {
                ':genreValue': {'S': genre},
                ':titleValue': {'S': title},
            }
        };
  
        // 実行
        return await this.dynamodb.query(params).promise();
 
    }
 
}

Lambda関数実行コマンドは以下の通りです。AWS CLI から実行しています。

aws lambda invoke --function-name DynamoDbFunction --payload $(echo '{ "genre": "POP", "title": "GREEN"}' | base64) outputfile.txt

結果

{
    "Items": [
        {
            "artist": {
                "S": "YUI"
            },
            "sngsCnt": {
                "N": "18"
            },
            "genre": {
                "S": "POP"
            },
            "title": {
                "S": "GREEN GARDEN POP"
            }
        }
    ],
    "Count": 1,
    "ScannedCount": 1
}

最後に

次回はテーブルからscanを使用して複数の項目を取得します。

© DeNnie.Lab All Rights Reserved.