繁体   English   中英

在理解更新 Dynamodb 中的数据时遇到问题。 我不明白这个 updateTodo 中发生了什么

[英]Having problem in understanding to update data in Dynamodb. I can't understand what is happening in this updateTodo

我有一个 lambda function,它应该使用 AppSync 更新 dynamodb 上的字段。 但是我很难理解代码。 因为我不明白 for 循环和创建变量“属性”的目的是什么,以及所有这些参数和前缀变量的目的。 我的 dynamo 表的主键在哪里

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;

此方法正在构建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方法通过几个步骤动态构建此参数 hash:

  1. 此代码块正在创建一个名为params的 map。 它通过查找TODOS_TABLE环境变量来指定表名。 Key指的是分区键,在此示例中名为id
    let params: Params = {
        TableName: process.env.TODOS_TABLE,
        Key: {
            id: todo.id
        },
        ExpressionAttributeValues: {},
        ExpressionAttributeNames: {},
        UpdateExpression: "",
        ReturnValues: "UPDATED_NEW"
    };

请注意ExpressionAttributeValuesExpressionAttributeNamesUpdateExpression键如何都具有空值。

  1. 下一步是根据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 map,看起来像这样:

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"
        }
    };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM