为什么DynamoDB需要expressionAttributeValue?

Ant*_*ott 9 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

Jar*_*eld 13

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

实际上,通过使用ExpressionAttributeNames属性并指定属性名称来执行避免保留字.您正在引用ExpressionAttributeValues,这是指定值列表的位置.有关" 使用属性名称和值的占位符"文档页面上提供了更多信息.

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