我有一个名为“users”的 Amazon DynamoDB 表,其中有一个用户的字段为 -UserId、FirstName、LastName、SignedInAt、SignedOutAt、IsSigned。
我只想更新某些字段,而不是全部,但是当我执行以下代码时,我没有更新的字段消失了。
所以,我只剩下 UserID、SignedInAt 和 IsSignedIn 字段。如何在其他字段不消失的情况下进行更新?
我正在使用 JavaScript。
谢谢!!!
执行代码前:
await dynamo
.put({
TableName: "users",
Item: {
UserId: requestJSON.UserId,
SignedInAt: new Date().toLocaleTimeString(), // 11:18:48 AM
IsSignedIn: true
}
})
.promise();
之后:
答案 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
};
};