Amazon web services 如何在DynamoDB查询中为分页生成可靠的“hasMoreResults”值

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}

我试图在一个简单的DynamoDB表上按日期范围对查询执行分页,并希望将LastEvaluatedKey强制为“hasMoreResults”布尔值,以便前端使用,但现在请注意,即使日期范围内的项目数不超过我的限制,结果上有时也会出现非空的LastEvaluatedKey。这是否意味着我将始终需要执行一个不返回任何附加项的后续查询

我的桌子看起来像:

[
    {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
,即使没有更多的项目剩余。但这是一个典型的问题,我也想知道一个很好的解决办法。期待一个很好的答案:)谢谢你的信息。目前,我添加了第二个查询,唯一的目的是确定是否有更多的结果。这是一个玩具应用程序,所以我不太在乎它的效率低下,但感觉很糟糕,我希望有人能提出更好的方法(假设有)。