如何在 DynamoDB 中更新项目并维护 CreatedAt 和 UpdatedAt 字段?

Dim*_*y K 4 amazon-dynamodb

我正在尝试将网络测验的答案保存到 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();
Run Code Online (Sandbox Code Playgroud)

Cos*_*tin 6

查看AWS 文档

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

SET 支持以下功能:

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

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

    // 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(), 
    }
Run Code Online (Sandbox Code Playgroud)