我正在创建一项个人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的最新值?
任何指导将不胜感激。
答案 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
}
}