首页 > 解决方案 > JS 更新 Dynamo 表中的 Map 元素

问题描述

TL/DR:如何在不修改 Dynamo 中的整个 Map 的情况下更新单个 Map 键/值?

我在一个简单的表格中有一个地图。我试图实现 UPDATE,但我不确定如何引用 Map 对象的键/值对。这是我尝试过的,以及我的表格的屏幕截图:

在此处输入图像描述

传入参数 updq(更新问题),updans(更新答案),ans(原始答案),qq(原始问题)

var params = {
  TableName: TABLE_NAME,
  Key: { topic: topic },
  ExpressionAttributeNames: {
    "#qq": qq,
    "#updq": updq,
  },
  ExpressionAttributeValues: {
    ":ans": ans,
    ":updans": updans,
  },
};
if (!doUpdate) {
  //replace/create
  params["UpdateExpression"] = "SET questions.#qq = :ans"; //this works
} else {
    params["UpdateExpression"] = "SET questions.#updq = :updq, _____"; //<<<<<<<<<<THIS DOESNT
}

console.log(`writing params: `, params);
let res = await docClient.update(params).promise();

标签: node.jsamazon-dynamodbdynamodb-queries

解决方案


用于创建新问题:问题地图已经存在,因此,SET questions.#qq = :ans将在 MAP 中创建一个条目

  params.ExpressionAttributeNames = {
    "#qq": qq,
  };
  params.ExpressionAttributeValues = {
    ":ans": ans,
  };
  params.UpdateExpression = "SET questions.#qq = :ans";

对于更新现有问题,可能是问题本身而不仅仅是答案,因此,我们需要删除现有问题并创建一个新问题,因此,我们需要添加REMOVE questions.#qq

  params.ExpressionAttributeNames = {
    "#qq": qq,
    "#updq": updq,
  };
  params.ExpressionAttributeValues = {
    ":updans": updans,
  };
  params.UpdateExpression =
    "REMOVE questions.#qq SET questions.#updq = :updans";
}

推荐阅读