我正在通过AWS Amplify使用无服务器框架在AWS上开发基于测验的应用程序。用于此应用程序的数据库是DynamoDB。
我正在尝试将用户答案列表作为记录存储在数据库中。现在,我的分区键(名为“ type”)为quizDraftAnswers_{user-id}
,因此我可以根据用户的ID快速检索记录。我还有一个排序键(名为“ id”)为category_{category-id}#subCategory_{subcategory-id}
。我正在创建的测验中的问题分为类别和子类别。为了更快地检索数据,我认为这是设计排序键的最佳方法。
然后,记录具有questions
属性作为类型列表。此属性包含“问题ID”列表及其在地图中的答案。
这是数据结构的示例:
{
"id": "category_89#subCategory_90",
"questions": [
{
"id": "101",
"answerId": "1"
},
{
"id": "102",
"answerId": "3"
},
{
"id": "103",
"answerId": "5"
},
{
"id": "104",
"answerId": "3"
}
],
"type": "quizDraftAnswers_74527"
}
我创建了一个API,该API将userId
,category
,subCategory
,questionId
和answerId
发送到执行某些NodeJS发电机的Lambda函数。代码。
DynamoDB遇到的问题是,我将如何更新问题列表?
例如,如果这是用户回答的第一个问题,我将如何创建初始记录(id
,type
,question[]
,其中包含带有{ {1}}和id
)?如何在问题列表的末尾添加新答案?如果用户更改了答案,我该如何在问题列表中进行更新?
这是我到目前为止拥有的Lambda函数:
answerId
我似乎无法弄清Update Expression。我尝试了许多不同的变体,但总是会遇到某种错误。我想知道是否有人对编写此代码的正确方法有任何建议。
答案 0 :(得分:0)
您需要使用list_append
函数将新元素添加到列表中。 here(将元素追加到列表部分)
所以您的参数应该像这样
const params = {
TableName: tableName,
Key: {
type: `quizDraftAnswers_${employeeId}`,
id: `category_${categoryId}#subCategory_${subCategoryId}`
},
UpdateExpression: `SET #questions = list_append(if_not_exists(#questions, :empty_list), :value)`,
ExpressionAttributeNames: {
'#questions': 'questions'
},
ExpressionAttributeValues: {
':empty_list': [],
':question': questionId,
':value': answerId
}
};
顾名思义,if_not_exists
函数检查列表是否已经存在。如果不是简单地添加一个空列表[]
,则将新值附加到现有列表中。