ios - 在非键属性上查询 DynamoDB

标签 ios amazon-web-services amazon-dynamodb

是否可以在 AWS 版本 2 中使用非键属性过滤 DynamoDB 查询?亚马逊说他们可以做到:http://amzn.to/1FVgQ9B .但是他们也提供 API 吗?我找到了 AWSDynamoDBQueryExpression,但我认为它只允许对范围键进行过滤(没有足够的文档)。我正在寻找适用于 iOS 和 AWS 版本 2 的 API。谢谢!

最佳答案

我正在回答我自己的问题。这也是我在 AWS 支持论坛上发布的内容:

您无法使用高级 API -- AWSDynamoDBObjectMapper 执行此操作。使用AWSDynamoDBObjectMapper时,需要向查询方法提供一个AWSDynamoDBQueryExpression对象来指定查询条件。 AWSDynamoDBQueryExpression 没有为您提供在非键属性上设置过滤器(条件)的选项。我想知道为什么不支持这个!但是,AWSDynamoDBScanExpression 允许您在使用扫描方法时指定非键属性的条件。但是,当您真正指的是查询时,您不想扫描。

幸运的是,您可以使用低级 API 来执行此操作,方法是直接调用 AWSDynamoDB 上的查询,提供 AWSDynamoDBQueryInput,让您可以指定许多低级参数。 AWSDynamoDBQueryInput 允许您使用 queryFilter 或 filterExpression 指定非键属性的筛选条件。 queryFilter 已弃用,建议使用 filterExpression。 以下是帮助我解决这个问题的两个文档:

http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html http://docs.aws.amazon.com/AWSiOSSDK/latest/Classes/AWSDynamoDBQueryInput.html

这是 swift 中的代码示例。在此代码中,我基于非关键属性的“已批准”字段进行过滤。 recId为主键:

    func getApprovedRecords(recId: Int) {



     let dynamoDB = AWSDynamoDB.defaultDynamoDB()

        var startKey = nil

        var queryInput = AWSDynamoDBQueryInput()

        queryInput.tableName = TABLE_NAME

        queryInput.limit = QUERY_SIZE

        queryInput.exclusiveStartKey = startKey



        var recIdValue = AWSDynamoDBAttributeValue()

        recIdValue.N = String(recId)

        var recIdCondition = AWSDynamoDBCondition()

        recIdCondition.comparisonOperator = AWSDynamoDBComparisonOperator.EQ

        recIdCondition.attributeValueList = [recIdValue]



        queryInput.keyConditions = [ "recId"\" : recIdCondition]


        var oneValue = AWSDynamoDBAttributeValue()

        oneValue.N = "1"



        queryInput.expressionAttributeValues = [ ":one" : oneValue ]    

        queryInput.filterExpression = "approved = :one"

        dynamoDB.query(queryInput).continueWithBlock { (task: BFTask!) -> AnyObject! in

            if ((task.error) != nil) {

                NSLog("The request failed. Error: \(task.error)")

            }

            if ((task.exception) != nil) {

                NSLog("The request failed. Exception: \(task.exception)")

            }

            if ((task.result) != nil) {

                NSLog("The request  succeeded.")

                let results = task.result as! AWSDynamoDBQueryOutput

                for r in results.items {

                    // do whatever with the result

                }

            }

            return nil

        }

    }

关于ios - 在非键属性上查询 DynamoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30138094/

相关文章:

ruby-on-rails - Ruby on Rails DynamoDB AWS 开发工具包 v2

ios - 使用 Swift 通过 PHP 将图像上传到我的服务器

amazon-web-services - AWS Config 交付策略不足错误

amazon-web-services - 如何防止 terraform 询问在 AWS Secrets Manager 上设置的变量的值?

ios - AWS 无法订阅 SNS 主题 : CognitoIdentityCredentials is not authorized to perform: SNS:Subscribe

python - 如何使用 Boto 使 dynamoDB 中的 key 过期?

javascript - 使用nodejs异步保存到dynamodb

ios - 在 iPhone 中以编程方式从另一个应用程序打开“设置”应用程序

ios - 是否可以从适用于 iOS 的 AIR 应用程序导出 PDF

ios - 当用户离开当前屏幕时,ARKit 应用应该做什么?