限制和排序扫描结果 AWS

Limiting and Ordering the Scan Result AWS

我正在使用 AWS mobilehub 并创建了一个 dynamoDb table(userId, username, usertoplevel, usertopscore)。 我的分区键是一个字符串 (userId),我创建了一个全局搜索索引 (GSI),其中我将 usertoplevel 设为分区键,将 usertopscore 设为排序键。我可以通过以下代码成功查询到所有项目

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());
            }

现在我在 table 中有 1500 多条记录,我想将结果限制为仅获取前 10 个用户。如果有人帮助,我将不胜感激。

可以在扫描表达式中设置limit。请仔细阅读 LIMIT 的定义。这是要评估的最大项目数的限制。不过,如果扫描中没有使用过滤表达式,则无需担心。

以防万一,如果你使用过滤器表达式,你可能需要进行递归扫描,直到 LastEvaluatedKey 为 null。

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

The maximum number of items to evaluate (not necessarily the number of matching items). If DynamoDB processes the number of items up to the limit while processing the results, it stops the operation and returns the matching values up to that point, and a key in LastEvaluatedKey to apply in a subsequent operation, so that you can pick up where you left off. Also, if the processed data set size exceeds 1 MB before DynamoDB reaches this limit, it stops the operation and returns the matching values up to the limit, and a key in LastEvaluatedKey to apply in a subsequent operation to continue the operation.

为了实现这一点,您需要放弃扫描并使用查询操作。 查询操作为您提供了一个选项来指定是应该向前读取索引还是向后读取索引。 为了获得前 10 个结果,您需要将结果 returned 限制为 10 个。这可以通过对查询操作设置限制来实现。 因此总结一下:

  1. 开始使用查询操作而不是扫描。
  2. 将 scanIndexForward 设置为 false 以开始按降序读取结果。
  3. 将您的查询操作限制为 return 个前 10 个结果。

此页面描述了我在此答案中提到的所有内容:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html