为什么DynamoDB需要expressionAttributeValue?

时间:2015-08-04 18:44:51

标签: amazon-dynamodb

我正在学习如何使用亚马逊的DynamoDB过滤扫描或查询的结果。我希望示例过滤器看起来像filter => name = Bob或类似的。但是,亚马逊需要使用表达式属性,例如filter => name = :person然后ExpressionAttributeValues => { ":person": {"S": "Bob"}}

这让我感到困惑和伤害,为什么我不能使用简单的name = Bob

官方文档:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults

显然是在近端工作的例子:https://github.com/aws/aws-cli/issues/1073

1 个答案:

答案 0 :(得分:12)

此类语法遵循与SQL系统中使用的预准备语句类似的方法。这是AWS的DynamoDB团队做出的设计决策。其中一个原因是允许字段与DynamoDB定义的冗长的reserved words列表(包括您在示例中使用的“名称”)冲突。

实际上,通过使用ExpressionAttributeNames属性并指定属性名称来执行避免保留字。您正在引用ExpressionAttributeValues,这是指定值列表的位置。有关详细信息,请参见Using Placeholders for Attribute Names and Values文档页面。

此设计的另一个动机是将语句与参数名称和值分开,类似于我已经提到的SQL中的预准备语句。虽然这可能看起来很奇怪,但它具有额外的好处,可以在NoSQL意义上有效地清理您的输入,避免您的用户输入可能出现的恶意或无意的问题,从而影响请求与DynamoDB交互的行为。