【问题标题】:How to upsert item in DynamoDB and maintain CreatedAt and UpdatedAt fields?如何在 DynamoDB 中更新项目并维护 CreatedAt 和 UpdatedAt 字段?
【发布时间】:2018-12-10 08:17:05
【问题描述】:

我正在尝试将网络测验的答案保存到 DynamoDB 表中。每次提交答案时,最终都会调用下面的代码。例如。对于 3 个答案,它将被调用 3 次。

每次添加答案时,UpdatedAt 字段都会更新为当前时间戳。这让我知道最后一个答案是什么时候提交的。但是我也想知道第一个答案是什么时候提交的,因此我也需要CreatedAt 字段。我想知道这如何实现?

(我正在检查ConditionalCheckExpression,但它似乎适用于整个更新操作。而我需要找到一种方法来更新CreatedAt,只有在第一次插入项目时)。

    const now = new Date();
    let updateParams = {
        TableName: process.env.TABLE_RESULTS, 
        Key: {
            QuizId: '' + quiz_id,
            SessionId: '' + session_key,
        },
        UpdateExpression: `SET #QQ_ID = :answer, #updatedAt = :updatedAt`,
        ExpressionAttributeNames: {
            '#QQ_ID'   : `QQ_${question_id}`,
            '#updatedAt': 'UpdatedAt',
        },
        ExpressionAttributeValues: {
            ':answer': answer,
            ':updatedAt' : now.toISOString(), 
        }
    };

    let result = await doc.update(updateParams).promise();

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    看看AWS docs

    SET - 为项目添加一个或多个属性和值。如果这些属性中的任何一个已经存在,它们将被新值替换。您还可以使用 SET 对 Number 类型的属性进行加减运算。例如:SET myNum = myNum + :val

    SET 支持以下功能:

    • if_not_exists(路径,操作数) - 如果项目在指定路径不包含属性,则 if_not_exists 计算为操作数;否则,它评估为路径。您可以使用此函数来避免覆盖项目中可能已经存在的属性。

    • list_append(操作数,操作数) - 计算为一个添加了新元素的列表。您可以通过颠倒操作数的顺序将新元素附加到列表的开头或结尾。

        // use if_not_exists()
        UpdateExpression: `SET #QQ_ID = :answer, #updatedAt = :updatedAt, #createdAt = if_not_exists(#createdAt, :createdAt)`,
        ExpressionAttributeNames: {
            '#QQ_ID'   : `QQ_${question_id}`,
            '#updatedAt': 'UpdatedAt',
            '#createdAt': 'CreatedAt',
        },
        ExpressionAttributeValues: {
            ':answer': answer,
            ':updatedAt' : now.toISOString(), 
            ':createdAt' : now.toISOString(), 
        }
    

    【讨论】:

    • 谢谢!那些“SET 功能”很方便!错过了if_not_exists,因为:a) 认为if_not_existsattribute_not_exists 是相同的(它们不是:前者是“SET 函数”,后者是“ConditionExpression 函数”。b)我错误地认为只有 ConditionExpression 可以有函数(“SET”和“ConditionExpression”都可以有函数)。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    相关资源
    最近更新 更多