在非关键属性上查询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已被弃用,build议使用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 } }