2017-09-05 86 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