当前位置: 首页 > 知识库问答 >
问题:

迪纳摩DB API:如何构建“如果不存在,则添加 JSON 属性”更新请求?

晋西岭
2023-03-14

我正在尝试使用新的Amazon DynamoDB JSON API在称为“文档”的JSON属性中添加/覆盖键值对。理想情况下,我想简单地构建我的写入调用以发送KV对以添加到属性中,如果给定主键不存在该属性,则让Dynamo创建该属性。但是,如果我只使用简单的UpdateItemSpec来尝试:

PrimaryKey primaryKey = new PrimaryKey("key_str", "mapKey");
ValueMap valuesMap = new ValueMap().withLong(":a", 1234L).withLong(":b", 1234L);
UpdateItemSpec updateSpec = new UpdateItemSpec().withPrimaryKey(primaryKey).withUpdateExpression("SET document.value1 = :a, document.value2 = :b");
updateSpec.withValueMap(valuesMap);
table.updateItem(updateSpec);

我得到了com.amazonaws。AmazonServiceException:更新表达式中提供的文档路径对于更新无效,这意味着DynamoDB无法找到要应用更新的名为“document”的给定属性。

我设法通过以下一系列调用来近似此功能:

try {
    // 1. Attempt UpdateItemSpec as if attribute already exists
} catch (AmazonServiceException e) {
    // 2. Confirm the exception indicated the attribute was not present, otherwise rethrow it
    // 3. Use a put-if-absent request to initialize an empty JSON map at the attribute "document"
    // 4. Rerun the UpdateItemSpec call from the above try block
}       

这是可行的,但是不够理想,因为每当我向表中添加一个新的主键时,都需要调用3次DynamoDB。我尝试了一下可以在更新表达式中使用的< code > attribute _ not _ exists 函数,但是无法让它按照我想要的方式工作。

任何发电机大师对如何/是否可以做到这一点有任何想法?

共有1个答案

慕金林
2023-03-14

我收到了来自Amazon Support的答复,实际上不可能通过一次调用来完成这一点。他们确实建议在将新主键的属性从3添加到2时减少调用次数,方法是在put-if-缺席请求中使用所需的JSON映射而不是空映射。

 类似资料:
  • 问题内容: 我有一个钥匙型课。让我们称为map的实例。 我要添加{ ,}(是的一个实例,并且一)该地图。但是,如果键已经存在,我想求和该映射图中的当前值。 目前我使用 但是在Java 8中是否有一种时髦的方式来做到这一点,例如使用和? 遗憾的是我无法弄清楚。 谢谢。 问题答案: 这就是地图上的合并功能的作用。 这可以进一步减少到 它基本上等于

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用

  • 问题内容: 我试图添加一个属性,如果它不存在。它应该很简单,但是我是XML XPath / XQuery / etc的新手,所以请原谅我的无知。 我希望能够传递XML数据并对其进行修改… 如果我像这样传递数据: 我想要 并不是 : 问题答案: 你可以做 但是,这只会更改不具有runat属性的第一个后代,至少对于SQL Server 2005,您一次只能修改一个节点。 也许将以上内容与WHILE结合

  • 我是网络开发新手,所以这可能是非常基本的。如果datainfo prop变量不是空的,我想向div标记添加一个数据属性 但是现在,如果datavalue是空的,则data属性会添加一个空值。相反,我希望它根本不会出现在div标签中。 我可以在JSX子句中添加整个内容吗?

  • 在阅读AWS DynamoDB留档时,我看到它不建议创建多个表。但是当我们将json格式化的数据放在DynamoDB表中时,应该是创建具有许多级别(例如10)的嵌套json内容的属性还是具有较少级别的多个属性?我想这是逐案处理的。但我想知道的是设计DynamoDB表时的一般规则。阅读AWS文档后,我仍然感到困惑,所以我在这里发布问题。谢谢!

  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。