Amazon web services 如何在DynamoDB查询中为分页生成可靠的“hasMoreResults”值
我试图在一个简单的DynamoDB表上按日期范围对查询执行分页,并希望将LastEvaluatedKey强制为“hasMoreResults”布尔值,以便前端使用,但现在请注意,即使日期范围内的项目数不超过我的限制,结果上有时也会出现非空的LastEvaluatedKey。这是否意味着我将始终需要执行一个不返回任何附加项的后续查询 我的桌子看起来像:Amazon web services 如何在DynamoDB查询中为分页生成可靠的“hasMoreResults”值,amazon-web-services,amazon-dynamodb,dynamodb-queries,documentclient,Amazon Web Services,Amazon Dynamodb,Dynamodb Queries,Documentclient,我试图在一个简单的DynamoDB表上按日期范围对查询执行分页,并希望将LastEvaluatedKey强制为“hasMoreResults”布尔值,以便前端使用,但现在请注意,即使日期范围内的项目数不超过我的限制,结果上有时也会出现非空的LastEvaluatedKey。这是否意味着我将始终需要执行一个不返回任何附加项的后续查询 我的桌子看起来像: [ {PK: "john", SK: "2021-01-01:08:00", amount: 1}
[
{PK: "john", SK: "2021-01-01:08:00", amount: 1},
{PK: "john", SK: "2021-01-01:20:00", amount: 2},
{PK: "john", SK: "2021-01-02:08:00", amount: 3},
{PK: "john", SK: "2021-01-02:20:00", amount: 4},
{PK: "john", SK: "2021-01-03:08:00", amount: 5},
{PK: "john", SK: "2021-01-03:20:00", amount: 6}
...and on for all of January
];
使用JavaScript DocumentClient,我的查询如下所示:
async function getEntriesByDate({name, startDate, endDate, limit, sort}) {
return await docClient.query({
TableName: "someTableName",
KeyConditionExpression: "#pk = :pk and #sk Between :startDate And :endDate",
ExpressionAttributeNames: {
"#pk": "PK",
"#sk": "SK"
},
ExpressionAttributeValues: {
":pk": name,
":startDate": startDate,
":endDate": endDate
},
ScanIndexForward: sort === "asc",
Limit: limit
}).promise();
}
如果调用函数时,结束日期与第四项的日期完全匹配,且限制为4:
getEntriesByDate({name: "john", startDate: "2021-01-01:08:01", endDate: "2021-01-02:20:01", limit: 4, sort:"asc"});
我得到以下结果:
{
"Items": [
{"PK": "john", "SK": "2021-01-01:08:00", "amount": 1},
{"PK": "john", "SK": "2021-01-01:20:00", "amount": 2},
{"PK": "john", "SK": "2021-01-02:08:00", "amount": 3},
{"PK": "john", "SK": "2021-01-02:20:00", "amount": 4 }
],
"Count": 4,
"ScannedCount": 4
}
太好了,没有最后评估的钥匙。这正是我所期望的。但是,如果我使用相同的参数调用函数,除了在结束日期前添加一分钟,我会得到:
{
"Items": <same as in last query, which is expected>,
"Count": 4,
"ScannedCount": 4,
"LastEvaluatedKey": {
"SK": "2021-01-02:20:00",
"PK": "john"
}
}
{
“项目”:,
“计数”:4,
“扫描计数”:4,
“LastEvaluatedKey”:{
“SK”:“2021-01-02:20:00”,
“PK”:“约翰”
}
}
即使没有满足查询的其他项,也会显示
LastEvaluatedKey
。这个问题有惯用的解决办法吗?为了确保可靠的hasMoreResults
值,在我的函数中是否需要后续查询(可能使用ExclusiveStateKey
),我认为这里的问题是DynamoDB如何在其分区中分发数据,如本文所述。简而言之:DynamoDB无法确保没有更多的项目剩余,这就是为什么它返回LastEvaluatedKey
,即使没有更多的项目剩余。但这是一个典型的问题,我也想知道一个很好的解决办法。期待一个很好的答案:)谢谢你的信息。目前,我添加了第二个查询,唯一的目的是确定是否有更多的结果。这是一个玩具应用程序,所以我不太在乎它的效率低下,但感觉很糟糕,我希望有人能提出更好的方法(假设有)。