代码之家  ›  专栏  ›  技术社区  ›  lurning too koad

AppSync查询冲突解决程序:是否需要ExpressionNames和ExpressionValues?

  •  0
  • lurning too koad  · 技术社区  · 7 年前

    https://docs.aws.amazon.com/appsync/latest/devguide/resolver-mapping-template-reference-dynamodb.html#aws-appsync-resolver-mapping-template-reference-dynamodb-query

    AppSync Doc说 expressionNames expressionValues 是可选字段,但它们始终由代码生成填充。第一个问题,在使用dynamodb时,是否应将它们作为最佳实践包括在内?如果是,为什么?

    分区键查询的AppSync冲突解决程序:

    {
        "version": "2017-02-28",
        "operation": "Query",
        "query": {
            "expression": "#partitionKey = :partitionKey",
            "expressionNames": {
                "#partitionKey": "partitionKey"
            },
            "expressionValues": {
                ":partitionKey": {
                    "S": "${ctx.args.partitionKey}"
                }
            }
        }
    }
    

    第二个问题,外行翻译的 expression 上面代码中的字段?那句话到底告诉dynamodb做什么?它的用途是什么 # 在里面 "expression": "#partitionKey = :partitionKey" 表达式名称和值是否只是格式保护?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tinou    7 年前

    让我先回答你的第二个问题:

    表达名称

    expressionNames 用于插值。这意味着在插值之后,这个过滤器表达式对象:

    "expression": "#partitionKey = :value",
    "expressionNames": {
        "#partitionKey": "id"
    }
    

    将转换为:

    "expression": "id = :value",
    

    这个 #partitionKey 用作列名称的占位符 id . '#' 恰好是分隔符。

    但是为什么呢?

    表达名称 是必要的,因为 keywords are reserved by DynamoDB ,表示不能在dynamodb表达式中使用这些单词。

    表达式值

    当需要比较dynamodb表达式中的任何内容时,还需要使用占位符替换实际值,因为dynamodb类型的值是一个复杂的对象。

    在以下示例中:

    "expression": "myKey = :partitionKey",
    "expressionValues": {
        ":partitionKey": {
            "S": "123"
        }
    }
    

    :partitionKey 是复杂值的占位符

    {
        "S": "123"
    }
    

    ':' 是指示dynamodb使用 expressionValues 替换时映射。

    为什么是 表达名称 表达式值 总是由代码生成使用?

    对于代码生成逻辑来说,总是使用 表达名称 表达式值 因为保留/非保留dynamodb字不需要有两个代码路径。使用 表达名称 将始终防止碰撞!