Средство разрешения запросов AppSync: необходимы ли выражения expressionNames и expressionValues? - PullRequest
0 голосов
/ 19 января 2019

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

AppSync doc говорит, что 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" и являются ли имена и значения выражений просто защитными средствами форматирования?

1 Ответ

0 голосов
/ 20 января 2019

Позвольте мне сначала ответить на ваш второй вопрос:

expressionNames

expressionNames используются для интерполяции. Это означает, что после интерполяции этот объект выражения фильтра:

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

будет преобразовано в:

"expression": "id = :value",

#partitionKey действует как заполнитель для имени вашего столбца id. '#' оказывается разделителем.

Но почему?

expressionNames необходимы, поскольку некоторые ключевые слова зарезервированы DynamoDB , что означает, что вы не можете использовать эти слова внутри выражения DynamoDB.

expressionValues ​​

Когда вам нужно сравнить что-либо в выражении DynamoDB, вам также необходимо использовать замену фактического значения с использованием заполнителя, поскольку типизированное значение DynamoDB является сложным объектом.

В следующем примере:

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

:partitionKey является заполнителем для комплексного значения

{
    "S": "123"
}

':' - это другой разделитель, который указывает DynamoDB использовать карту expressionValues при замене.

Почему expressionNames и expressionValues всегда используются при генерации кода?

Просто для логики генерации кода всегда проще использовать expressionNames и expressionValues, потому что нет необходимости иметь два пути кода для зарезервированных / незарезервированных слов DynamoDB. Использование expressionNames всегда предотвращает столкновения!

...