使用 Swift 3 在 DynamoDB 中保留关键字 ExpressionAttributeValues

reserved keyword ExpressionAttributeValues in DynamoDB using Swift 3(使用 Swift 3 在 DynamoDB 中保留关键字 ExpressionAttributeValues)

本文介绍了使用 Swift 3 在 DynamoDB 中保留关键字 ExpressionAttributeValues的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够在没有 :status : 接受表达式属性值的情况下获得响应,但是有了它,当我在 projectionExpression 行中使用 #status 时出现以下错误(status 是 DynamoDB 中的保留字,所以我有按 https://stackoverflow.com/a/45952329/5921575 在那里添加主题标签):

I am able to get a response without the :status : accept expression attribute value but with it, I get the following error when I am using the #status in the projectionExpression line (status is a reserved word in DynamoDB so I had to add hashtag there per https://stackoverflow.com/a/45952329/5921575):

Error Domain=com.amazonaws.AWSCognitoIdentityErrorDomain Code=0 "(null)" 
UserInfo={__type=com.amazon.coral.validate#ValidationException, 
message=Value provided in ExpressionAttributeValues unused in expressions: keys: {:status}}

代码如下:

queryExpression.keyConditionExpression = "#userId= :userId"
queryExpression.expressionAttributeNames = ["#userId":"userId", "#status":"status"]
queryExpression.expressionAttributeValues = [":userId":userID, ":status":"accept"]
queryExpression.projectionExpression = "#status"

我可以不用 ":status":"accept" 但我不想得到很多没有接受值的项目.我在此链接或 stackoverflow 上的任何地方都找不到答案:http://docs.aws.amazon.com/amazondynamodb/最新/developerguide/Expressions.ExpressionAttributeNames.html

I can go without the ":status":"accept" but I do not want to get a lot of items that do not have the accept value. I can't find an answer in this link or anywhere on stackoverflow: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html

谢谢!

推荐答案

有点晚了,但是:你的投影表达式不应该是#status",而是另一个不是状态的词.Status 是保留字,所以不要将它用于投影表达式.有关需要使用保留字时该怎么做的文档,请参阅此处:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html#Expressions.ExpressionAttributeNames.ReservedWords

A bit late, but: Your projection expression should not be "#status" but another word that isn't status. Status is the reserved word, so don't use that for the projection expression. See here for docs on what to do when you need to use a reserved word: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html#Expressions.ExpressionAttributeNames.ReservedWords

另一方面,userId 不需要投影表达式,因为它不是保留字.请参阅此处获取保留字列表:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html

userId, on the other hand, does not require a projection expression because it is not a reserved word. See here for a list of reserved words: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html

但是,您不需要投影表达式.您可以简单地使用下面的代码.定义queryExpression.expressionAttributeNames"以创建状态属性值的替代名称.在这里,我使用了短语statusVal"作为替代.

However, you don't need a projection expression. You can simply use the code below. Define "queryExpression.expressionAttributeNames" to create a substitute name for the status attribute value. Here, I used the phrase "statusVal" as a substitute.

试试这个.(它对我有用)

Try this. (It worked for me)

let queryExpression = AWSDynamoDBQueryExpression()
queryExpression.expressionAttributeNames = ["#statusVal":"status"] // Using statusVal because it is not reserved. You only need statusVal here because it is the only attribute that also happens to be an AWS reserved word.
queryExpression.keyConditionExpression = "userId = :uId AND #statusVal = :sV"
queryExpression.expressionAttributeValues = [
     ":uId" : String(describing: userId),
     ":sV" : "accept"]

然后使用 AWSDynamoDBObjectMapper 执行操作!祝你好运!

And then perform the operation using AWSDynamoDBObjectMapper! Good luck!

这篇关于使用 Swift 3 在 DynamoDB 中保留关键字 ExpressionAttributeValues的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:使用 Swift 3 在 DynamoDB 中保留关键字 ExpressionAttributeValues

基础教程推荐