如果存在则增加该值,否则在 DynamoDB 中添加一个新条目

Ris*_*pta 2 amazon-web-services node.js amazon-dynamodb aws-lambda

我有一个 DynamoDB 表,其列和主键为ipAddress

  • IP地址
  • 访问

我正在从我的 React 网站获取用户的 IP 地址,并通过 Lambda 函数和 API Gateway POST 请求将其插入到 DynamoDB。

如果来自 React 网站的 IP 地址已经存在于 DynamoDB 中,则增加visits列中的值。如果没有,则使用新的 IP 地址和visits = 1. 我尝试使用ConditionExpression但无济于事。

到目前为止,我只使用 Lambda 插入 ipAddress。下面是我在 NodeJS 中的 Lambda 函数:

const AWS = require("aws-sdk");
const documentClient = new AWS.DynamoDB.DocumentClient();

exports.handler = async event => {
  const { ipAddress} = JSON.parse(event.body);
  const params = {
    TableName: "ipAddress",
    Item: {
      ipAddress: ipAddress,
    }
  };

  try {
    const data = await documentClient.put(params).promise();
    const response = {
      statusCode: 200,
    };
    return response;
  }
  catch (e) {
    return {
      statusCode: 500,
      body: JSON.stringify(e)
    };
  }

};
Run Code Online (Sandbox Code Playgroud)

Bal*_*ala 5

我们需要使用update-item而不是put-item,如果记录不存在,两者都会创建一个记录。但是 update-item 接受UpdateExpression来帮助我们更新现有属性。

UpdateExpression: "SET visits = if_not_exists(visits, :initial) + :num"

if_not_existsinitial当属性visits不存在时,有助于第一次使用值。

docClient.update(
  {
    TableName: "ipAddress",
    Key: {
      ipAddress: ipAddress,
    },
    UpdateExpression: "SET visits = if_not_exists(visits, :initial) + :num",
    ExpressionAttributeValues: {
      ":num": 1,
      ":initial": 0,
    },
  },
  function (error, result) {
    console.log("error", error, "result", result);
  }
);
Run Code Online (Sandbox Code Playgroud)