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"
的用途是什么,表达式名称和值只是格式化防护措施吗?
答案 0 :(得分:2)
让我先回答您的第二个问题:
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
更为简单,因为对于保留的/非保留的DynamoDB字不需要两个代码路径。使用expressionNames
可以始终防止碰撞!