簡體   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