在不覆盖其他字段的情况下更新 Amazon DynamoDB 中的项目字段

时间:2021-06-23 13:52:38

标签: amazon-web-services aws-lambda amazon-dynamodb

我有一个名为“users”的 Amazon DynamoDB 表,其中有一个用户的字段为 -UserId、FirstName、LastName、SignedInAt、SignedOutAt、IsSigned。

我只想更新某些字段,而不是全部,但是当我执行以下代码时,我没有更新的字段消失了。

所以,我只剩下 UserID、SignedInAt 和 IsSignedIn 字段。如何在其他字段不消失的情况下进行更新?

我正在使用 JavaScript。

谢谢!!!

执行代码前:

enter image description here

await dynamo
      .put({
        TableName: "users",
        Item: {
          UserId: requestJSON.UserId,
          SignedInAt: new Date().toLocaleTimeString(), // 11:18:48 AM
          IsSignedIn: true
        }
      })
      .promise();

之后:

enter image description here

2 个答案:

答案 0 :(得分:1)

您的代码的问题在于您使用了 put 方法。要更新 Amazon DynamoDB 项目,您需要调用 updateItem 方法。这是 Java V2 API 中的一个示例(您可以将此代码移植到您的编程语言),它根据密钥更新项目。

public static void updateTableItem(DynamoDbClient ddb,
                                       String tableName,
                                       String key,
                                       String keyVal,
                                       String name,
                                       String updateVal){

        HashMap<String,AttributeValue> itemKey = new HashMap<String,AttributeValue>();

        itemKey.put(key, AttributeValue.builder().s(keyVal).build());

        HashMap<String,AttributeValueUpdate> updatedValues =
                new HashMap<String,AttributeValueUpdate>();

        // Update the column specified by name with updatedVal
        updatedValues.put(name, AttributeValueUpdate.builder()
                .value(AttributeValue.builder().s(updateVal).build())
                .action(AttributeAction.PUT)
                .build());

        UpdateItemRequest request = UpdateItemRequest.builder()
                .tableName(tableName)
                .key(itemKey)
                .attributeUpdates(updatedValues)
                .build();

        try {
            ddb.updateItem(request);
        } catch (ResourceNotFoundException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        // snippet-end:[dynamodb.java2.update_item.main]
        System.out.println("Done!");
    }

答案 1 :(得分:1)

已解决

const AWS = require("aws-sdk");

const dynamo = new AWS.DynamoDB.DocumentClient();

exports.handler = async(event, context) => {
  let body;
  let user;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json"
  };

  try {
    let requestJSON = JSON.parse(event.body);
    switch (event.routeKey) {
      case "GET /items":
        body = await dynamo.scan({ TableName: "users" }).promise();
        break;
      case "PUT /signIn":
        await dynamo
          .update({
            TableName: "users",
            Key: {
              UserId: requestJSON.UserId
            },
            UpdateExpression: "set SignedInAt = :a, IsSignedIn = :b, SignedOutAt = :c",
            ExpressionAttributeValues: {
              ":a": new Date().toLocaleTimeString(),
              ":b": true,
              ":c": ""
            }
          })
          .promise();
        body = `Put item ${requestJSON.UserId}`;
        break;
      case "PUT /signOut":
        await dynamo
          .update({
            TableName: "users",
            Key: {
              UserId: requestJSON.UserId
            },
            UpdateExpression: "set SignedOutAt = :a, IsSignedIn = :b",
            ExpressionAttributeValues: {
              ":a": new Date().toLocaleTimeString(),
              ":b": false,
            }
          })
          .promise();
        body = `Put item ${requestJSON.UserId}`;
        break;
      default:
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  }
  catch (err) {
    statusCode = 400;
    body = err.message;
  }
  finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers
  };
};