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

更新嵌套映射dynamodb

华永新
2023-03-14

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

如何编写一个更新表达式来更新位置到名称=欧宝的项目的“就位三”,标签包括“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" 
  } 

共有3个答案

吕英才
2023-03-14

您可以按照以下方式更新嵌套映射:

>

  • 首先创建并清空map类型的item属性。在示例图中,为空项属性。

    dynamoTable = dynamodb.Table('abc')
    dynamoTable.put_item(
        Item={
            'email': email_add,
            'graph': {},
        }
    

    更新嵌套映射,如下所示:

    brand_name = 'opel'
    DynamoTable = dynamodb.Table('abc')
    
    dynamoTable.update_item(
        Key={
            'email': email_add,
        },
        UpdateExpression="set #Graph.#brand= :name, ",
        ExpressionAttributeNames={
            '#Graph': 'inventory',
            '#brand': str(brand_name),
        },
        ExpressionAttributeValues = {
            ':name': {
                "location": "in place two",
                'tag': {
                    'graph_type':'a3',
                    'graph_title': 'f5'
                } 
            }
    

  • 麻宜春
    2023-03-14

    更新迈克的答案,因为这种方式不再有效(至少对我来说)。

    它现在是这样工作的(请注意UpdateExpressionExpressionAttributeNames):

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

    无论在Key={}中出现什么,它总是分区键(和排序键,如果有的话)。

    编辑:似乎这种方式只适用于具有两级嵌套属性的情况。在本例中,您将仅对“中间”属性使用“ExpressionAttributeNames”(在本例中,这将是#brandinv.#brand.loc)。我现在还不确定真正的规则是什么。

    太叔英卫
    2023-03-14

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

    您可以使用更新表达式更新嵌套映射中的属性,这样只有项目的一部分会得到更新(即。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来为你执行这些复杂的操作,而不是具体说明你想要更新什么。

     类似资料:
    • 我用的是Protobuf 3。从文档来看,似乎无法定义嵌套贴图: 我正在尝试创建一种消息类型来表示期权链的定价信息(出价和要价)。对于那些不熟悉这些金融工具的人,基本上我有一套“到期日期(YYYYMMDD)”。在每个过期日期中,我都有一组“strikes(float number;如果需要,可以用字符串表示,我同意)”。在每次行使中,我有两个期权,一个“看跌”和一个“看涨”(这被称为期权的“右”)

    • 我尝试使用MapStruct编写映射器类,如下所示: 目前它显示了“未知属性”“customer.customerid”和“usertypes.usertype.userid”等错误。有人能帮我用MapStruct映射所有这些元素吗? 问题2:我们如何绘制跟踪图?1)customerId usertypes->user->userid 2)pdtPrice offers->OffersType->

    • 我用下面的方法尝试了嵌套映射。 我在声明“root_cause”时出错:[{“type”:“mapper_parsing_exception”,“reason”:“root映射定义有不支持的参数:[type:nested]。” 感谢您的帮助。

    • 我有一个方法可以返回相当嵌套的JSON,比如: 当我尝试使用< code>JsonSlurper将这个JSON slurp到< code>def result中时,我得到了异常: 当<code>parseText</code>执行时产生引发的异常: 有什么办法吗?

    • 有人能帮忙填写上面的评论部分吗?或者是否有其他选项来映射这些对象? 编辑:我尝试了下面的解决方案,但是接口实现类本身发生了变化。

    • 我创建映射如下所示。如何将平面dto对象属性(街道、城市等)映射到域对象中的嵌套地址。当我试着去做的时候,我发现了一个错误: [错误]诊断:返回类型中的属性“Address.PostalCode”未知。@Mapping(来源=“City”,目标=“Address.City”), 还有类...