Amazon dynamodb 在DynamoDB中使用list_append和映射列表

Amazon dynamodb 在DynamoDB中使用list_append和映射列表,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我有一个DynamoDB表,其模式与下面类似。我想在jobs属性上运行一个“upsert”函数,该函数将添加jobs属性或附加到列表中 执行代码时,我收到一条错误消息: 调用UpdateItem操作时出错(ValidationException):UpdateExpression无效:运算符或函数的操作数类型不正确;运算符或函数:列表\追加,操作数类型:M 模式: { "jobs": [ { "event_id": "event_id", "job_map":

我有一个DynamoDB表,其模式与下面类似。我想在
jobs
属性上运行一个“upsert”函数,该函数将添加jobs属性或附加到列表中

执行代码时,我收到一条错误消息:

调用UpdateItem操作时出错(ValidationException):UpdateExpression无效:运算符或函数的操作数类型不正确;运算符或函数:列表\追加,操作数类型:M

模式:

{
  "jobs": [
    {
      "event_id": "event_id",
      "job_map": [
        {
          "key1": "val1",
          "key2": "val2"
        }
      ],
      "job_start": "time_stamp"
    }
  ],
  "p_key": "some_id"
}
示例/文档:

  • 示例代码:

    p_key_string = 'some_id'
    event_id = '123'
    job_start = 'timestamp_string'
    
    task_map = []
    for item in items:
        task_map.append({
            "M": {
                'key1': {"S": item.get('val1')},
                'key2': {"S": item.get('val2')}
            }
        })
    
    args = {
        'Key': {
            'p_key': p_key_string
        },
        'UpdateExpression': "SET p_key = :p_key, #ri = list_append(#ri, :vals)",
        'ConditionExpression': "attribute_not_exists(p_key) OR p_key = :p_key",
        'ExpressionAttributeNames': {
            "#ri": "jobs"
        },
        'ExpressionAttributeValues': {
            ':p_key': p_key_string,
            ':vals': {
                "L": [{
                    "M": {
                        "event_id": { "S": event_id},
                        "job_start": { "S": job_start},
                        'job_map': { "L": task_map}
                    }
                }]
            }
        }
    }
    
    dynamo_client.update_item(**args)
    
    基于这个错误,我尝试了一个更简单的查询,但实际上得到了相同的错误

    ...
    ':vals': {
        "L": [
            { "S": event_id},
            { "S": job_start}
        ]
    }
    ...
    

    所以我真的不确定我遗漏了什么。

    我不完全确定我理解为什么,但是通过删除数据类型声明,我能够克服错误。上面的代码有一些额外的错误,但下面的更改似乎对我有效

    ...
    task_map.append({
      'key1': 'val1',
      'key2': 'val2'
    })
    ...
    
    ...
    args = {
      'Key': {
        'p_key': p_key_string
      },
      'UpdateExpression': "SET jobs = list_append(if_not_exists(jobs, :empty_list), :vals)",
      'ExpressionAttributeValues': {
        ':vals': [{
          "event_id": event_id,
          "job_start": job_start,
          "job_map": task_map
        }],
        ":empty_list": []
      }
    }
    ...
    

    我不完全明白为什么,但通过删除数据类型声明,我能够克服错误。上面的代码有一些额外的错误,但下面的更改似乎对我有效

    ...
    task_map.append({
      'key1': 'val1',
      'key2': 'val2'
    })
    ...
    
    ...
    args = {
      'Key': {
        'p_key': p_key_string
      },
      'UpdateExpression': "SET jobs = list_append(if_not_exists(jobs, :empty_list), :vals)",
      'ExpressionAttributeValues': {
        ':vals': [{
          "event_id": event_id,
          "job_start": job_start,
          "job_map": task_map
        }],
        ":empty_list": []
      }
    }
    ...
    

    dynamodb_客户端
    实际上是一个
    对象,而不是常规的dynamodb客户端吗


    Table
    对象将自动将dynamodb数据格式转换为本机数据类型,而常规dynamodb客户端则不会。

    dynamodb\u客户端
    实际上是
    Table
    对象,而不是常规dynamodb客户端

    对象将自动将dynamodb数据格式转换为本机数据类型,而常规dynamodb客户端则不会