当前位置: 首页 > 面试题库 >

更新嵌套地图dynamodb

薛华奥
2023-03-14
问题内容

我有一个带有包含嵌套地图的属性的dynamodb表,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,该过滤器表达式从该地图中生成单个项目。

如何编写一个更新表达式以将名称更新为name = opel的项的位置“替换为三”,标签包括“
x1”(可能还包括f3)?这应该只更新第一个列表元素的location属性。

(
  "inventory": [
    {
      "location": "in place one",      # I want to update this
      "name": "opel",
      "tags": [
        "x1",
        "f3"
      ]
    },
    {
      "location": "in place two",
      "name": "abc",
      "tags": [
        "a3",
        "f5"
      ]
    }],
"User" :"test" 
 }

问题答案:

更新的答案-基于更新的问题陈述

您可以使用更新表达式来更新嵌套地图中的属性,以便仅更新项目的一部分(即DynamoDB将对项目应用补丁的等效项),但是由于DynamoDB是文档数据库,因此所有操作(输入,获取,更新,删除等)对整个项目进行操作。

因此,在您的示例中,假设User是分区键,并且没有排序键(在该示例中我没有看到任何可能是排序键的属性),那么更新请求可能如下所示:

table.update_item(
  Key={
    'User': 'test'
  },
  UpdateExpression="SET #inv[0].#loc = :locVal",
  ExpressionAttributeNames={
    '#inv': 'inventory',
    '#loc': 'location'
  },
  ExpressionAttributeValues={
    ':locVal': 'in place three',
  },
)

就是说,您确实必须知道项目架构的外观以及应该正确更新项目中的哪些属性。

DynamoDB无法对子项目进行操作。意思是,没有办法告诉Dynamo执行诸如
“更新项目,设置’库存’数组中具有’名称’等于’欧宝’的元素的’位置’属性”之类的操作”

这可能不是您想要的答案,但这是今天可用的答案。您可以通过稍微更改架构来更接近所需的内容。

如果需要按名称引用子项,则可以存储以下内容:

{
  "inventory": {
    "opel": {
       "location": "in place one",      # I want to update this
       "tags": [ "x1", "f3" ]
    },
    "abc": {
       "location": "in place two",
       "tags": [ "a3", "f5" ]
    }
  },
  "User" :"test" 
}

那么您的查询将是:

table.update_item(
  Key={
    'User': 'test'
  },
  UpdateExpression="SET #inv.#brand.#loc = :locVal",
  ExpressionAttributeNames={
    '#inv': 'inventory',
    '#loc': 'location',
    '#brand': 'opel'
  },
  ExpressionAttributeValues={
    ':locVal': 'in place three',
  },
)

但是YMMV还是有局限性,因为您只能按名称标识库存商品(即,您仍然不能说“使用标签’x1’更新库存”)

最终,您应该仔细考虑为什么需要Dynamo来为您执行这些复杂的操作,而不是具体说明要更新的内容。



 类似资料:
  • 问题内容: 它运行。 它也可以运行。 它再次运行! 但是失败了!? Go中的嵌套地图有问题吗?还是对嵌套地图没有多括号支持? 问题答案: 地图类型的零值为。尚未初始化。您无法在地图中存储值,这是运行时的恐慌。 在上一个示例中,您初始化了(外部)映射,但是它没有条目。当您像那样对它进行索引时,由于尚无键输入,因此对其进行索引将返回用于地图的值类型的零值。因此,尝试分配给运行时恐慌。 您必须先初始化地

  • 我有一个dynamodb表,它的一个属性包含一个嵌套的映射,我想更新一个特定的库存项目,该项目通过一个过滤器表达式进行过滤,从而从该映射中生成一个项目。 如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“x1”(也可能是f3)?这应该只更新第一个列表元素位置属性。

  • 问题内容: 添加评论时,我试图使angular.js视图本身进行更新。我的代码如下: 范围在输入时更新: 调试$ scope.currentItem显示注释已添加到其中,但是视图未显示新注释。我怀疑$ scope仅在其第一级被监视,这就是为什么视图不更新的原因。是这样吗?如果可以,我该如何解决? 解决方案:正如Ajay在下面的回答中所建议的那样,我将数组推入包装为apply函数,如下所示: 问题答

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。

  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!

  • 我有以下架构 我想为创建静态方法,以便根据给定的更新 我的情况与建议的复制相似,但不相同,因为那里的家伙知道所有的,而我不知道。

  • 我正在使用平均堆栈在网格中显示以下数组。 嵌套数组:

  • 问题内容: 我正在尝试更新嵌套数组中的值,但无法使其正常工作。 我的对象是这样的 我需要将值推送到“ answeredBy”数组。 在下面的示例中,我尝试将“成功”字符串推到“ 123 _id”对象的“ answeredBy”数组中,但是它不起作用。 我找到了此链接,但其答案仅表示我应该使用类似结构的对象而不是数组。这不适用于我的情况。我真的需要将我的对象嵌套在数组中 如果您能在这里帮助我,那就太