【问题标题】:DynamoDB sort and paginationDynamoDB 排序和分页
【发布时间】:2020-06-04 09:12:23
【问题描述】:

我正在尝试从排序的 dynamoDB 表中获取数据,但我也想要分页,因为有很多行。这是我的查询参数,control_id 是 GSI,时间戳作为排序键,id 是主键。我认为我需要在同一个查询中使用两个索引,因为现在这是我得到的ValidationException: The provided starting key is invalid,如果我删除ExclusiveStartKey,它就可以工作。

params = {
 TableName: tableName,
 IndexName: 'control_id',
 KeyConditionExpression: 'control_id = :ci',
 ExpressionAttributeValues: {
  ':ci': 1
 },
 ScanIndexForward: false,
 Limit: 250,
 ExclusiveStartKey: {
  'id': lastKey
 }
}

【问题讨论】:

    标签: javascript amazon-web-services aws-lambda amazon-dynamodb


    【解决方案1】:

    如果您同时拥有分区键和排序键作为主键,则需要将两者都提供给 ExclusiveStartKey。在构建主键、分区键或复合键(由分区键和排序键组成)时,Dynamo 为您提供了两个选项。使用复合键时,在引用表中的单个记录时总是需要同时提供分区键和排序键

    来自文档 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/API_Query_v20111205.html) -

    ExclusiveStartKey - 项的主键,从中继续先前的查询。一个 较早的查询可能会将此值作为 LastEvaluatedKey 提供,如果 查询操作在完成查询之前被中断;任何一个 由于结果集大小或 Limit 参数。这 LastEvaluatedKey 可以在新的查询请求中传回以继续 从那时开始的操作。

    类型:HashKeyElement,或 HashKeyElement 和 RangeKeyElement 复合主键。

    这里,HashKeyElement 指的是分区键,RangeKeyElement 指的是排序键

    试试

    ExclusiveStartKey: {
      'id': lastKey
      'created_at': <last key's created_at value>
     }
    

    或者实际上可能是 -

    ExclusiveStartKey: lastkey
    

    取决于您所拥有的lastKey,它可能已经是复合键

    【讨论】:

    • id 是我的主键,这就是我的表的外观link,control_id 每行都是 1,所以我可以对 ASC 或 DESC 进行排序
    • 但是control_id是你的排序键吗?
    • 从上面的阅读中,你说你的时间戳是排序键?如果是这种情况,您的主键由 id 和您的时间戳组成,因此您需要同时提供这两个
    • 否,control_id 是二级索引,created_at 是 control_id 的排序键,主键 id 没有排序键
    • 所以你的control_id索引的主键是一个复合键,由id作为分区键和created_at作为排序键,因此你需要将两者都提供给ExclusiveStartKey。见上面的编辑
    猜你喜欢
    • 2011-07-15
    • 2012-08-23
    • 2012-03-14
    • 2012-05-10
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多