Позвольте мне сначала ответить на ваш второй вопрос:
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
всегда предотвращает столкновения!