我正在尝试将网络测验的答案保存到 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)
查看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)
| 归档时间: |
|
| 查看次数: |
2088 次 |
| 最近记录: |