【问题标题】:Updating a list of attributes of item更新项目的属性列表
【发布时间】: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,将 userIdcategorysubCategoryquestionIdanswerId 发送到执行一些 NodeJS 发电机代码的 Lambda 函数。

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

例如,如果这是用户回答的第一个问题,我将如何创建初始记录(idtypequestion[],其中包含带有 idanswerId 的 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


    【解决方案1】:

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

    【讨论】:

    • 这将如何处理用户回答的更新/更改?如果用户更改了他们的答案,这如何仅更新该问题?
    猜你喜欢
    • 2018-09-24
    • 2018-02-17
    • 2017-10-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多