2015-05-09 77 views
3

是否可以過濾DynamoDB查詢在AWS 2版中使用非關鍵屬性?亞馬遜說,他們可以做到這一點:http://amzn.to/1FVgQ9B。但他們是否也提供API?我發現AWSDynamoDBQueryExpression,但我認爲它只允許過濾範圍鍵(沒有足夠的文檔)。我在iOS和AWS版本2中尋找適當的API。謝謝!查詢DynamoDB非關鍵屬性

+0

爲了['Query'](http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html),你必須** **提供hashKey。然後,您可以使用任何其他屬性的[過濾器表達式[(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults)來過濾下來的結果。 – mkobit

+0

我還沒有找到在iOS中執行此操作的API。看起來沒有。我知道,理論上他們在文件中說你發送的文件是可能的。請注意,該文檔是獨立於平臺的。 – user2732722

回答

5

我回答我的問題。這是我對AWS支持論壇發佈,以及:

不能與高層次的API做到這一點 - AWSDynamoDBObjectMapper。當使用AWSDynamoDBObjectMapper,您需要提供一個AWSDynamoDBQueryExpression對象的查詢方法來指定查詢條件。 AWSDynamoDBQueryExpression不提供您在非關鍵屬性上設置過濾器(條件)的選項。我想知道爲什麼這不被支持!但是,AWSDynamoDBScanExpression允許您在使用掃描方法時指定非關鍵屬性的條件。但是當你實際上查詢的時候你不想掃描。

幸運的是,你可以通過直接調用查詢上AWSDynamoDB提供AWSDynamoDBQueryInput它可以讓你指定了很多低級參數使用低級別的API做到這一點。 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

下面是迅速的代碼示例。在此代碼中,我基於「已批准」字段進行篩選,該字段是非關鍵屬性。 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 

     } 

    } 
+0

您能否提供一個示例代碼以及您如何實現此功能? – iEngineer

+0

我在答案中添加了代碼。我希望它有幫助! – user2732722