【发布时间】:2019-10-31 11:13:22
【问题描述】:
我正在通过 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,将 userId、category、subCategory、questionId 和 answerId 发送到执行一些 NodeJS 发电机代码的 Lambda 函数。
我在使用 DynamoDB 时遇到的问题是,我将如何更新问题列表?
例如,如果这是用户回答的第一个问题,我将如何创建初始记录(id、type、question[],其中包含带有 id 和 answerId 的 Map )?如何在问题列表的末尾添加新答案?如果用户更改了他们的答案,我将如何在问题列表中更新它?
这是我目前拥有的 Lambda 函数:
exports.updateAnswer = (employeeId, categoryId, subCategoryId, questionId, answerId) =>
new Promise(async resolve => {
const params = {
TableName: tableName,
Key: {
type: `quizDraftAnswers_${employeeId}`,
id: `category_${categoryId}#subCategory_${subCategoryId}`
},
UpdateExpression: `SET #questions[].:id = :value`,
ExpressionAttributeNames: {
'#questions': 'questions'
},
ExpressionAttributeValues: {
':question': questionId,
':value': answerId
}
};
dynamodb.update(params, (err, data) => {
if (err) {
resolve({ error: true, message: err });
} else {
resolve({ error: false, items: data.Items });
}
});
});
更新表达式是我似乎无法弄清楚的。我尝试了许多不同的变体,但总是以某种错误告终。我想知道是否有人对编写此代码的正确方法有任何建议。
【问题讨论】:
标签: node.js amazon-web-services amazon-dynamodb aws-amplify