Dynamo DB:更新列表属性

时间:2019-10-31 11:13:22

标签: node.js amazon-web-services amazon-dynamodb aws-amplify

我正在通过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将userIdcategorysubCategoryquestionIdanswerId发送到执行某些NodeJS发电机的Lambda函数。代码。

DynamoDB遇到的问题是,我将如何更新问题列表?

例如,如果这是用户回答的第一个问题,我将如何创建初始记录(idtypequestion[],其中包含带有{ {1}}和id)?如何在问题列表的末尾添加新答案?如果用户更改了答案,我该如何在问题列表中进行更新?

这是我到目前为止拥有的Lambda函数:

answerId

我似乎无法弄清Update Expression。我尝试了许多不同的变体,但总是会遇到某种错误。我想知道是否有人对编写此代码的正确方法有任何建议。

1 个答案:

答案 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函数检查列表是否已经存在。如果不是简单地添加一个空列表[],则将新值附加到现有列表中。