在理解更新 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"
    ;

注意ExpressionAttributeValuesExpressionAttributeNamesUpdateExpression 键的值都是空的。

    下一步是根据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 中发生了啥的主要内容,如果未能解决你的问题,请参考以下文章

在理解依赖注入时遇到问题

我在理解 AVX shuffle 内在函数如何为 8 位工作时遇到了一些问题

我在理解 IQueryable<T> 时遇到问题

Flutter 中的状态更新

了解 MVC 模式

Amazon dynamoDB 计数器更新和获取项目