Получение последних данных из AWS DynamoDB - PullRequest
0 голосов
/ 30 января 2019

Я создаю личный навык Alexa, который может регистрировать сбережения, которые я получаю ежедневно.Допустим, сегодня я сэкономил 10 $, я хочу, чтобы мой навык alexa запомнил это вместе с текущей суммой общей суммы денег, которую я сэкономил до сих пор, так что если вчера я сэкономил 5 $, если я спрашиваю навык о своих сбережениях, он должен вернуться с 15 $.Я также хочу, чтобы он имел возможность вычитать из общей суммы, когда я снимаю деньги.Так что, если я получу 5 $ завтра, новый итог должен составить 10 $.

Я сделал часть навыка Alexa, где я могу получить сумму в 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);
  }
});

Моя путаница заключается в том, что столбец итогов будет иметь отношение к запросу.в таблице работа?Я хотел бы предположить, что я хотел бы запросить последнее значение общей суммы, добавить новую сумму от пользователя и записать обновленную общую сумму обратно в таблицу?Но я не уверен, как написать этот запрос, чтобы получить последнее значение итога?

Любое руководство будет оценено.

1 Ответ

0 голосов
/ 31 января 2019

Как вы прокомментировали, вам не нужно вести историю движения, самый простой способ достичь вашей цели - использовать операцию ADD при вызове API UPDATE.

Вот пример кода, который работает:

// 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
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...