AppSync查询解析器:是否需要expressionNames和expressionValues?

时间:2019-01-19 17:14:55

标签: amazon-dynamodb aws-appsync

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

AppSync文档说expressionNamesexpressionValues是可选字段,但是它们始终由代码生成填充。第一个问题,在使用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 个答案:

答案 0 :(得分:2)

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

expressionNames

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

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

将转换为:

"expression": "id = :value",

#partitionKey充当您的列名id的占位符。 '#'恰好是分隔符。

但是为什么?

expressionNames是必需的,因为某些keywords are reserved by DynamoDB意味着您不能在DynamoDB表达式中使用这些单词。

expressionValues

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

在以下示例中:

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

:partitionKey是复数值的占位符

{
    "S": "123"
}

':'是另一个分隔符,它告诉DynamoDB在替换时使用expressionValues映射。

为什么代码生成总是使用expressionNamesexpressionValues

对于代码生成逻辑而言,始终使用expressionNamesexpressionValues更为简单,因为对于保留的/非保留的DynamoDB字不需要两个代码路径。使用expressionNames可以始终防止碰撞!