我正在尝试使用LSI在dynamodb中实现分页(向前和向后)。
我已经在abc属性上创建了LSI,其类型为字符串包含格式为"https://mydomain/[A-Za-z1-9-_~]“的字符。
当我尝试向前分页时,当到达最后一条记录时,LastEvaluated键变成空,这是预期的行为,但是对于反向分页,我得到的是LastEvaluatedKey。甚至引用了文档https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-response-LastEvaluatedKey
如果我想实现向后分页,如何使用查询操作找到最后一页是什么?
我的代码
params.ScanIndexForward = false;
response = await dynamoDb.query(paramsForQuery).promise();
console.log('LE', response.LastEvaluatedKey);
const arrayLength = response.Items.length;
LastEvalSortKey = {
pk: userId,
originalUrl: response.Items[0].originalUrl,
};
if (sortBy === 'createdAt')
LastEvalSortKey[sortBy] = response.Items[0].createdAt;
if (sortBy === 'updatedAt')
LastEvalSortKey[sortBy] = response.Items[0].updatedAt;
if (sortBy === 'convertedUrl')
LastEvalSortKey[sortBy] = response.Items[0].convertedUrl;
return {
items: response.Items,
nextToken: arrayLength
? Base64.encodeURI(JSON.stringify(LastEvalSortKey))
: prevToken,
prevToken: response.LastEvaluatedKey
? Base64.encodeURI(JSON.stringify(response.LastEvaluatedKey))
: undefined,
};发布于 2021-12-02 08:28:08
您链接到的文档提供了答案:
如果LastEvaluatedKey不为空,则不一定表示结果集中有更多数据。知道何时到达结果集末尾的唯一方法是当LastEvaluatedKey为空时。
知道已经结束的唯一方法是查询,直到得到一个空的LastEvaluatedKey。
如果您可以保证单个页面中的数据大小不会接近1MB的查询限制,那么可以使用的一个技巧是查询(page + 1)个项。
如果查询返回page + 1项,则可以丢弃最后一项,并使用它来获知存在另一个页面。如果它返回的条目较少,而您有一个LastEvaluatedKey,那么您可以假定没有额外的数据,或者执行一个额外的单个条目查询,以检查您是否在末尾。
https://stackoverflow.com/questions/69927816
复制相似问题