从AWS DynamoDB检索最新数据

时间:2019-01-30 11:39:40

标签: node.js amazon-web-services aws-lambda amazon-dynamodb

我正在创建一项个人Alexa技能,该技能可以记录我每天的积蓄。所以可以说我今天节省了10美元,我想让我的alexa技能记住这一点,以及到目前为止我已节省的总金额的总和,所以如果昨天我已经节省了5美元,请问该技能有关我的储蓄,则应返回15 $。我也希望它有能力,当我提款时从总金额中减去。因此,如果我明天拿出5美元,那么新的总数应该是10美元。

我已经完成了Alexa技能的一部分,在那里我可以在lambda函数中获取var,varUserAmount中的金额。但是我被困在那里。我还能够使以下查询正常工作,每次我说一个值时,该值就会写入到dynamodb中。

var params = {
 TableName: 'AccountManagement',
 Item: {
 'date' : {S: 'test'},
 'amount' : {N: varUserAmount},
 }
};

// Call DynamoDB to add the item to the table
 ddb.putItem(params, function(err, data) {
 if (err) {
  console.log("Error", err);
 } else {
 console.log("Success", data);
  }
});

我的困惑是在查询方面,表中的total列将如何工作?我假设我要查询总计的最后一个值,从用户中添加新金额,然后将更新后的总计写回到表中?但是我不确定如何编写该查询以获取total的最新值?

任何指导将不胜感激。

1 个答案:

答案 0 :(得分:2)

正如您评论的那样,您不需要保留移动的历史记录,实现目标的最简单方法是对UPDATE API调用使用ADD操作。

以下是有效的示例代码:

// create table with 
//
// aws dynamodb create-table --table-name demo --key-schema AttributeName=id,KeyType=HASH --attribute-definitions AttributeName=id,AttributeType=N --billing-mode PAY_PER_REQUEST

const AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
const documentClient = new AWS.DynamoDB.DocumentClient();

const TABLE_NAME = 'demo';

async function insertOrUpdateDDB(userId, value) {

    return new Promise((resolve, reject) => {

        var params = {
            TableName: TABLE_NAME,
            Key: {
                id: userId
            },
            UpdateExpression: "ADD amount :val",
            ExpressionAttributeValues: {
                ":val": value
            }
        };

        documentClient.update(params, (err, data) => {
            if (err) {
                console.log("Error when calling DynamoDB");
                console.log(err, err.stack); // an error occurred
                reject(err);
            } else {
                //console.log(data); // successful response
                resolve(data);
            }
        });
    });
}

async function readDDB(userId) {

    return new Promise((resolve, reject) => {
        var params = {
            TableName: TABLE_NAME,
            Key: {
                id: userId
            }
        };

        documentClient.get(params, (err, data) => {
            if (err) {
                console.log("Error when calling DynamoDB");
                console.log(err, err.stack); // an error occurred
                reject(err);
            } else {
                //console.log(data); // successful response
                resolve(data);
            }
        });
    });
}

async function main() {
    console.log("adding 150 to the amount");
    await insertOrUpdateDDB(1, 150);

    console.log("removing 50 from the amount");
    await insertOrUpdateDDB(1, -50);

    console.log("querying the amount");
    let data = await readDDB(1);
    console.log(JSON.stringify(data,null,2));
}    

main();

产生:

$ node so.js
adding 150 to the amount
removing 50 from the amount
querying the amount
{
  "Item": {
    "id": 1,
    "amount": 100
  }
}