【问题标题】:AppSync query resolver: are expressionNames and expressionValues necessary?AppSync 查询解析器:是否需要 expressionNames 和 expressionValues?
【发布时间】:2019-06-13 15:13:12
【问题描述】:

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

【问题讨论】:

    标签: amazon-dynamodb aws-appsync


    【解决方案1】:

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

    表达式名称

    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 会更简单,因为不需要为保留/非保留 DynamoDB 字设置两个代码路径。使用expressionNames 将始终防止冲突!

    【讨论】:

    猜你喜欢
    • 2019-02-04
    • 1970-01-01
    • 2020-02-12
    • 2019-09-24
    • 1970-01-01
    • 2021-07-18
    • 2021-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多