Как проверить, а затем обновить элемент AWS DynamoDB в файле node.js? - PullRequest
0 голосов
/ 24 декабря 2018

Вот пример.Я использую функцию AWS Lambda в Node.JS.Это объект в DynamoDB:

{
    email: "johndoe@gmail.com",
    name: "John Doe",
    score: "12"
}

Теперь я хочу сначала проверить, каков его сохраненный счет.Если его текущая оценка больше, чем оценка, уже существующая в БД, то обновите БД, иначе оставьте все как есть.В настоящее время мой код обновляет его каждый раз.Я не уверен, как действовать и какую функцию использовать.

Если его оценка равна 15, то после проверки БД он должен обновить ее до:

{
    email: "johndoe@gmail.com",
    name: "John Doe",
    score: "15"
}

Если его оценка равна7, он должен оставить все как есть.

{
    email: "johndoe@gmail.com",
    name: "John Doe",
    score: "12"
}

Редактировать - Следующая проблема также была решена.Нашел обходной путь.Все еще ищу ответы.Поэтому оставьте его открытым.

Теперь моя проблема в том, что я использую одну и ту же функцию для обновления и создания записей.Возможно ли это?

Если новый пользователь играет в игру, его адрес электронной почты, имя и счет сохраняются в БД.А если играет существующий пользователь, обновляется только его счет, если он больше, чем в БД.

Вот где я застрял.Получив эти 2 вопроса, 1. name является зарезервированным ключевым словом.Интересно, как это позволило мне использовать имя в качестве атрибута, когда я просто использовал пут?2. электронная почта не может быть обновлена, поскольку она является частью ключа.

Вот мой текущий код,

function addToLeaderBoard(currentScore, email, name){
  var params = {
    TableName: tablename,
    Key: {
        "email": email
    },
    UpdateExpression: "set score = :num, name = :player, email = :mail",
    ConditionExpression: "score > :num",
    ExpressionAttributeValues: {
        ":num": currentScore,
        ":player": name,
        ":mail": email
    },
    ReturnValues: "UPDATED_NEW"
  };
  docClient.update(params, function(err, data) {
        if (err) console.log(err);
        else console.log(data);
    });
}

1 Ответ

0 голосов
/ 24 декабря 2018

Что вы хотите сделать, это условное обновление .Это позволяет обновлять только элемент в DynamoDB, если выполняется условие.В вашем случае это условие: новая оценка должна быть выше, чем существующая оценка.

Такое условное обновление будет выглядеть следующим образом.Обратите внимание на ConditionExpression, который отвечает за обновление элемента только при выполнении условия.

'use strict';

const aws = require('aws-sdk');

var newScore = 123;

var docClient = new AWS.DynamoDB.DocumentClient()
var params = {
    TableName: "players",
    Key: {
        "email": "johndoe@gmail.com"
    },
    UpdateExpression: "set score = :num",
    ConditionExpression: "score > :num",
    ExpressionAttributeValues: {
        ":num": newScore
    },
    ReturnValues: "UPDATED_NEW"
};
docClient.update(params, function(err, data) {
        if (err) console.log(err);
        else console.log(data);
    }
});
...