AppSync 查询解析器:是否需要 expressionNames 和 expressionValues?
AppSync query resolver: are expressionNames and expressionValues necessary?
AppSync 文档说 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"
中的 #
有什么用,表达式名称和值是否只是格式保护?
我先回答你的第二个问题:
表达式名称
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
映射的不同分隔符。
为什么代码生成总是使用 expressionNames
和 expressionValues
?
代码生成逻辑总是使用 expressionNames
和 expressionValues
更简单,因为 reserved/non-reserved DynamoDB 词不需要两个代码路径。使用 expressionNames
将始终防止碰撞!
AppSync 文档说 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"
中的 #
有什么用,表达式名称和值是否只是格式保护?
我先回答你的第二个问题:
表达式名称
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
映射的不同分隔符。
为什么代码生成总是使用 expressionNames
和 expressionValues
?
代码生成逻辑总是使用 expressionNames
和 expressionValues
更简单,因为 reserved/non-reserved DynamoDB 词不需要两个代码路径。使用 expressionNames
将始终防止碰撞!