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

AppSync query resolver: are expressionNames and expressionValues necessary?

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" 中的 # 有什么用,表达式名称和值是否只是格式保护?

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

表达式名称

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

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

将转换为:

"expression": "id = :value",

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

但是为什么呢?

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

表达式值

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

在下面的例子中:

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

:partitionKey 是复数值的占位符

{
    "S": "123"
}

':' 是告诉 DynamoDB 在替换时使用 expressionValues 映射的不同分隔符。

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

代码生成逻辑总是使用 expressionNamesexpressionValues 更简单,因为 reserved/non-reserved DynamoDB 词不需要两个代码路径。使用 expressionNames 将始终防止碰撞!