python - 更新嵌套 map dynamodb

标签 python nested amazon-dynamodb boto3

我有一个 dynamodb 表,其属性包含一个嵌套 map ,我想更新一个特定的库存项目,该项目是通过一个过滤器表达式过滤的,该过滤器表达式从该 map 中生成一个项目。

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

  {
    "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" 
  } 

最佳答案

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

您可以使用 update expressions 更新嵌套 map 中的属性这样只有项目的一部分会得到更新(即 DynamoDB 会对您的项目应用相当于补丁)但是,因为 DynamoDB 是一个文档数据库,所以所有操作(Put、Get、Update、Delete 等)都在项目作为一个整体。

因此,在您的示例中,假设 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' 数组元素的 'location' 属性,这些元素的属性 'name' 等于 'opel'”

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

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

{
  "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 为您执行这些复杂的操作,而不是您具体说明要更新的内容。

关于python - 更新嵌套 map dynamodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51911927/

相关文章:

java - 权力表

python - 如何通过 tasytpie API 将产品放入购物车?

spring - Dynamodb连接: strange behaviour

python - 在 python 中有效投影二分图(使用 networkx)

python - 解码 7 位 GSM

python - 使用错误的 python 路径覆盖,尽管 venv 是来源

php - JSON 解码嵌套数组 PHP 循环

python - 对两个列表进行排序——一个是列表的列表

amazon-web-services - AWS AppSync-使用GSI排序键将全局二级索引添加到DynamoDB和分页

case - 大写和小写在 Aws dynamoDB 中的 Contains 中不起作用?