【问题标题】:How to check and then update AWS dynamoDB item in node.js?如何检查并更新 node.js 中的 AWS dynamoDB 项目?
【发布时间】:2018-12-24 15:48:00
【问题描述】:

这是一个例子。我在 Node.JS 中使用 AWS Lambda 函数。这是 DynamoDB 中的对象:

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

现在我想先看看他保存的分数是多少。如果他当前的分数高于 DB 中已经存在的分数,则更新 DB,否则保持原样。目前,我的代码每次都在更新它。我不确定如何继续以及使用哪个功能。

如果他的分数是 15,那么在检查数据库后它应该将其更新为:

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

如果他的分数是7,它应该保持原样。

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

编辑 - 以下问题也已解决。找到了解决方法。仍在寻找答案。所以让它保持打开状态。

现在我的问题是我使用相同的功能来更新和创建记录。这可能吗?

如果新用户玩游戏,他的电子邮件、姓名和分数会保存到数据库中。如果现有用户玩游戏,则只有他的分数大于 DB 中的分数时才会更新。

这是我目前卡住的地方。得到这两个问题, 1. name 是保留关键字。我想知道当我刚刚使用 put 时,它是如何允许我使用 name 作为属性的。 2. email 无法更新,因为它是 key 的一部分。

这是我当前的代码,

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);
    });
}

【问题讨论】:

  • 到目前为止,您的更新代码看起来如何?
  • 我尝试将 get 和 put 函数结合起来,结果搞砸了。用我的进度更新了问题。

标签: node.js aws-lambda amazon-dynamodb aws-sdk-nodejs dynamodb-queries


【解决方案1】:

你想做的是conditional update。这允许您仅在满足条件时更新 DynamoDB 中的项目。在您的情况下,条件是新分数必须高于现有分数。

这样的条件更新类似于以下示例。注意里面的ConditionExpression,它只负责在满足条件时更新item。

'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);
    }
});

【讨论】:

  • 感谢您的回答。但我面临更多的问题。你能看看我的编辑并指导我吗?
  • @thedreamsaver 请为您的其他问题创建一个新问题 - 这已经回答了您的原始问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 2015-11-02
  • 2018-02-28
  • 1970-01-01
相关资源
最近更新 更多