【问题标题】:Limiting and Ordering the Scan Result AWS限制和排序扫描结果 AWS
【发布时间】:2017-09-05 13:18:16
【问题描述】:

我正在使用 AWS mobilehub 并创建了一个 dynamoDb 表(userIdusernameusertoplevelusertopscore)。 我的分区键是一个字符串 (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());
            }

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

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-mobilehub


    【解决方案1】:

    为了实现这一点,您需要远离 Scan 并使用 Query 操作。 查询操作为您提供了一个选项来指定是否应该正向或反向读取索引。 为了获得前 10 个结果,您需要将返回的结果限制为 10 个。这可以通过对查询操作设置限制来完成。 因此总结一下:

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

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

    【讨论】:

    • 但查询中的问题是我必须设置散列键,在我的情况下,如果我没有设置散列键,则没有设置散列键它给我一个错误“没有散列键条件是在查询中找到”,那么如何处理该条件
    【解决方案2】:

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

    如果您使用过滤器表达式,您可能需要进行递归扫描,直到 LastEvaluatedKey 为空。

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

    要评估的最大项目数(不一定是 匹配项)。如果 DynamoDB 处理的项目数达到 在处理结果时限制,它停止操作并返回 到该点的匹配值,以及 LastEvaluatedKey 中的一个键 在后续操作中申请,以便您可以在您所在的地方取货 离开了。另外,如果之前处理的数据集大小超过 1 MB DynamoDB 达到此限制,它会停止操作并返回 匹配值达到限制,并且 LastEvaluatedKey 中的键 在后续操作中申请以继续操作。

    【讨论】:

    • OP的问题似乎不是限制扫描返回的结果数量,而是根据usertopscore键获得前X个结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 2020-07-01
    • 2018-10-11
    • 2020-08-14
    • 2018-12-13
    相关资源
    最近更新 更多