【问题标题】:DynamoDBScanExpression withLimit returns more records than LimitDynamoDBScanExpression withLimit 返回的记录多于 Limit
【发布时间】:2020-07-02 18:48:34
【问题描述】:

必须列出 DynamoDB 表中的所有记录,而不需要任何过滤器表达式。 我想限制记录的数量,因此使用带有 setLimit 的 DynamoDBScanExpression。

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
....
// Set ExclusiveStartKey
....
scanExpression.setLimit(10);

但是,扫描操作总是返回 10 个以上的结果!!!! 这是预期的行为吗?如果是,如何?

【问题讨论】:

  • 你是如何加载/获取结果的?
  • 知道了,我使用的是 mapper.scan,它返回分页列表,并且 size() 操作进行内部调用以获取所有记录。应该使用 mapper.scanPage() 代替!

标签: amazon-dynamodb


【解决方案1】:

Python Answer

无法为scan() 操作设置limit,但是可以使用query 来设置。

query 搜索数据库中的行 items。它从列表的顶部或底部开始,并根据设置的条件查找项目。 您必须有一个分区和一个排序键才能执行此操作。

另一方面,扫描通过ENTIRE数据库而不是按项目搜索,因此,NOT排序。

由于查询基于项目,扫描基于ENTIRE数据库,因此只有查询可以支持限制。

要回答 OP 的问题,基本上它不起作用,因为您使用的是 scan 而不是 query

这是一个如何使用 CLIENT 语法的示例。(更高级的语法版本。抱歉,我没有使用 resource 的更简单示例。你可以用谷歌搜索。)

    def retrieve_latest_item(self):
        result = self.dynamodb_client.query(
        TableName="cleaning_company_employees",
        KeyConditionExpression= "works_night_shift = :value",
        ExpressionAttributeValues={':value': {"BOOL":"True"}},
        ScanIndexForward = False,
        Limit = 3
        )
    return result

这里是DynamoDB module docs

【讨论】:

    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多