Amazon dynamodb 为什么DynamoDB需要expressionAttributeValue?

Amazon dynamodb 为什么DynamoDB需要expressionAttributeValue?,amazon-dynamodb,Amazon Dynamodb,我正在学习如何使用Amazon的DynamoDB过滤扫描或查询结果。我希望示例过滤器看起来像filter=>name=Bob或类似的东西。但是,Amazon需要使用表达式属性,例如filter=>name=:person,然后使用ExpressionAttributeValues=>{:person:{“S”:“Bob”} 这让我感到困惑和头疼,为什么我不能使用简单的name=Bob 官方文件: 显然,工作示例接近尾声:这种语法遵循的方法类似于SQL系统中使用的预处理语句。这是AWS的Dyna

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

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


官方文件:


显然,工作示例接近尾声:

这种语法遵循的方法类似于SQL系统中使用的预处理语句。这是AWS的DynamoDB团队做出的设计决策。原因之一是允许字段与DynamoDB定义的冗长列表(包括您在示例中使用的“name”)冲突

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


这种设计的另一个动机是将语句与参数名和值分开,类似于我前面提到的SQL中的预处理语句。虽然一开始这似乎有些奇怪,但它还有一个额外的好处,即在NoSQL意义上有效地清理您的输入,避免用户输入可能出现的恶意或非故意问题,从而影响您在与DynamoDB交互时的请求行为。

DynamoDB对ExpressionAttributeName有一个类似但可选的命名约定使用“#”符号。我想知道为什么这是可选的,而ExpressionAttributeValue语法是强制性的。我理解与保留字的命名冲突,但为什么不将其保留为可选的,类似于ExpressionAttributeName?例如``KeyConditionExpression:“#myName=:myTag”,ExpressionAttributeValue:{”:myTag:“Database”},ExpressionAttributeNames:{”#myName:“Tag”}```