在理解更新 Dynamodb 中的数据时遇到问题。我无法理解此 updateTodo 中发生了啥
Posted
技术标签:
【中文标题】在理解更新 Dynamodb 中的数据时遇到问题。我无法理解此 updateTodo 中发生了啥【英文标题】:Having problem in understanding to update data in Dynamodb. I can't understand what is happening in this updateTodo在理解更新 Dynamodb 中的数据时遇到问题。我无法理解此 updateTodo 中发生了什么 【发布时间】:2021-05-19 16:20:02 【问题描述】:我有一个 lambda 函数,它应该使用 AppSync 更新 dynamodb 上的字段。但我很难理解代码。因为我无法理解 for 循环和创建变量“属性”的目的是什么,以及所有这些参数和前缀变量的目的。我的发电机表的主键在哪里
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient();
type Params =
TableName: string | undefined,
Key: string | ,
ExpressionAttributeValues: any,
ExpressionAttributeNames: any,
UpdateExpression: string,
ReturnValues: string
async function updateTodo(todo: any)
let params: Params =
TableName: process.env.TODOS_TABLE,
Key:
id: todo.id
,
ExpressionAttributeValues: ,
ExpressionAttributeNames: ,
UpdateExpression: "",
ReturnValues: "UPDATED_NEW"
;
let prefix = "set ";
let attributes = Object.keys(todo);
for (let i = 0; i < attributes.length; i++)
let attribute = attributes[i];
if (attribute !== "id")
params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute;
params["ExpressionAttributeValues"][":" + attribute] = todo[attribute];
params["ExpressionAttributeNames"]["#" + attribute] = attribute;
prefix = ", ";
try
await docClient.update(params).promise()
return todo
catch (err)
console.log('DynamoDB error: ', err)
return null
export default updateTodo;
【问题讨论】:
【参考方案1】:此方法正在构建updateItem 方法所需的属性。
下面是传递给upateItem
方法的参数的示例:
const params =
TableName: "YOUR_TABLE_NAME",
Key:
"id": "1"
,
UpdateExpression: "set #attribute1 = :a1, #attribute2 = :a2",
ExpressionAttributeNames:
"#attribute1": "attribute1_name"
"#attribute1": "attribute2_name"
,
ExpressionAttributeValues:
":a1": "attribute 1 value",
":a2": "attribute 2 value"
;
updateTodo
方法通过几个步骤动态构建此参数哈希:
-
此代码块正在创建一个名为
params
的映射。它通过查找TODOS_TABLE
环境变量来指定表名。 Key
指的是分区键,在本例中命名为 id
。
let params: Params =
TableName: process.env.TODOS_TABLE,
Key:
id: todo.id
,
ExpressionAttributeValues: ,
ExpressionAttributeNames: ,
UpdateExpression: "",
ReturnValues: "UPDATED_NEW"
;
注意ExpressionAttributeValues
、ExpressionAttributeNames
和UpdateExpression
键的值都是空的。
-
下一步是根据updateItem API 的要求设置
params[ExpressionAttributeValues]
和params[ExpressionAttributeNames]
。
let prefix = "set ";
let attributes = Object.keys(todo);
for (let i = 0; i < attributes.length; i++)
let attribute = attributes[i];
if (attribute !== "id")
params["UpdateExpression"] += prefix + "#" + attribute + " = :" + attribute;
params["ExpressionAttributeValues"][":" + attribute] = todo[attribute];
params["ExpressionAttributeNames"]["#" + attribute] = attribute;
prefix = ", ";
最终结果是一个params
映射,看起来像这样:
const params =
TableName: "YOUR_TABLE_NAME",
Key:
"id": "1"
,
UpdateExpression: "set #attribute1 = :a1, #attribute2 = :a2",
ExpressionAttributeNames:
"#attribute1": "attribute1_name"
"#attribute1": "attribute2_name"
,
ExpressionAttributeValues:
":a1": "attribute 1 value",
":a2": "attribute 2 value"
;
【讨论】:
感谢您的回答。虽然有一件事仍然让我感到困惑,但 For 循环的目的是什么。 for lop 遍历 todo 属性以构建 UpdateExpression、ExpressionAttribureNames 和 ExpressionAttributeVales。 todo 变量是一个属性映射,例如 attribute1: "value1", attribute2: "value2"。 for 循环遍历该数据以构建更新表达式以上是关于在理解更新 Dynamodb 中的数据时遇到问题。我无法理解此 updateTodo 中发生了啥的主要内容,如果未能解决你的问题,请参考以下文章