2017-09-05 88 views
0

我正在使用AWS mobilehub並創建一個dynamoDb表(userId,username,usertoplevel,usertopscore)。 我的分區鍵是一個字符串(userId),我創建了一個全局搜索索引(GSI),其中usertoplevel爲分區鍵,usertopscore爲排序鍵。我可以通過下面的代碼限制和訂購掃描結果AWS

final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression(); 
      List<UserstopcoreDO> results; 
      DynamoDBMapper mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper(); 
      results = mapper.scan(UserstopcoreDO.class, scanExpression); 
      for (UserstopcoreDO usertopScore : results) { 
       Logger.d("SizeOfUserScore : " + usertopScore.getUsertopscore()); 
      } 

成功查詢所有項目現在我有1500多個表中的記錄,我想限制結果只來獲取前10名用戶。如果有人幫忙,我會很感激。

回答

2

爲了實現這個目標,您需要離開掃描並使用查詢操作。 查詢操作爲您提供了一個選項,用於指定是應該向前讀取還是反向讀取索引。 爲了獲得前10個結果,您需要將結果限制爲10個。這可以通過設置查詢操作的限制來完成。 因此總結:

  1. 開始使用查詢操作,而不是掃描。
  2. 將scanIndexForward設置爲false以開始按降序讀取結果。
  3. 設置您的查詢操作的限制以返回前10個結果。

本頁面描述了所有我在這個答案中提到的事情:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

+0

但在查詢的問題是我必須設置散列鍵,在我的條件不出現亂碼的關鍵,如果我沒有設置散列關鍵字把它給我一個錯誤設置「不哈希關鍵條件是在查詢中發現,」所以如何以處理這種情況 –

-1

可以在掃描表達式中設置限制。請仔細閱讀LIMIT的定義。這是評估項目最大數量的限制。但是,如果在掃描中沒有使用過濾器表達式,則不需要擔心。

如果使用過濾器表達式,則可能需要執行遞歸掃描,直到LastEvaluatedKey爲空。

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression().withLimit(10); 

項目的最大數目,以評估(的 匹配項目不一定數)。如果DynamoDB在處理結果時處理達到 限制的項目數,它將停止該操作並返回 到該點的匹配值,並且LastEvaluatedKey中的一個鍵爲 適用於後續操作,以便您可以選擇你在哪裏 停止。此外,如果處理後的數據集的大小超過1 MB 之前DynamoDB達到此限制,它停止工作,並返回 匹配值到了極限,並且在LastEvaluatedKey到 一個鍵在後續操作中應用繼續操作。

+0

的OP的問題似乎並沒有被限制由掃描返回的結果的數量,而是讓高層X基於'usertopscore'鍵的結果。 – Dunedan