筛选/分页奇怪的结果

0

【以下的问题经过翻译处理】 我有一个包含七个记录的数据集:

Records

我想返回在12月14日至12月20日之间的所有记录,并按照每页两条的方式进行分页。这是我的第一个调用,请求结果的第一页:

Dictionary<string, AttributeValue> expressionAttributeValues = new Dictionary<string, AttributeValue>();
Dictionary<string, string> expressionAttributeNames = new Dictionary<string, string>();
string filterExpression = string.Empty;
AmazonDynamoDBClient client = new Amazon.DynamoDBv2.AmazonDynamoDBClient(creds);
List<RecordingMetaData> recordings = new List<RecordingMetaData>();

expressionAttributeValues.Add(":startTime", new AttributeValue { S = $"2022-12-14" });
expressionAttributeValues.Add(":endTime", new AttributeValue { S = $"2022-12-20" });
filterExpression = $"#start > :startTime AND #start <= :endTime";
expressionAttributeNames.Add("#start", "StartTime");

ScanRequest scanRequest = new ScanRequest()
{
    TableName = "SCRecordingMetaData",
    ExpressionAttributeNames = expressionAttributeNames,
    FilterExpression = filterExpression.Length > 0 ? filterExpression : null,
    ExpressionAttributeValues = expressionAttributeValues,
    Limit = 2
};

var response = new ScanResponse();
do
{
    response = client.Scan(scanRequest);

    response.Items.ForEach(i => recordings.Add(new RecordingMetaData()
    {
        RecordingID = i["RecordingID"].S,
        Duration = Convert.ToInt32(i["Duration"].N),
        StartTime = Convert.ToDateTime(i["StartTime"].S),
        EndTime = Convert.ToDateTime(i["EndTime"].S),
        ANI = i["ANI"].S,
        DNS = i["DNS"].S,
        CreatedTime = Convert.ToDateTime(i["CreatedTime"].S),
        FilePath = i["FilePath"].S,
        AgentIDs = i.ContainsKey("AgentIDs") ? i["AgentIDs"].L : null,
        QueueIDs = i.ContainsKey("QueueIDs") ? i["QueueIDs"].L : null
    }));
}
while (response.LastEvaluatedKey.Count > 1);

在请求中未设置限制时,它应该并且确实会返回3条记录。当将限制设置为2时,我期望第一页返回2个结果,并且最后评估键(LastEvaluatedKey)应为"5dcb2cd5-ddcc-41d8-b147-ec2aa95883ad",因为这是列表中满足筛选条件的第二个键。然而,实际上只返回了一个结果,即"2a45d769-fc43-4325-96ec-76e5cf0750fe",而且这也是最后评估键。如果我将此值传递给下一次调用的ExclusiveStartKey,虽然最后评估键为"8bce9df3-3921-4259-a70a-c9cf6d34f61f",但却返回0个结果。

因此,看起来发生的情况是它只返回满足筛选条件的记录,但在某种程度上仍然识别出其他尚未返回的记录仍然存在,即第一个未应用搜索筛选的记录集应包括"8c8c7afb-e529-4cb5-adb2-ab79d51f5741"和"2a45d769-fc43-4325-96ec-76e5cf0750fe",但由于筛选,它只返回一条记录"2a45d769-fc43-4325-96ec-76e5cf0750fe"。显然,应该返回"2a45d769-fc43-4325-96ec-76e5cf0750fe"和"5dcb2cd5-ddcc-41d8-b147-ec2aa95883ad"。

在出现这种行为的情况下,如何编写任何类型的分页呢?

profile picture
专家
已提问 1 年前75 查看次数
1 回答
0

【以下的回答经过翻译处理】 你好Nick,

你所经历的行为是由DynamoDB扫描操作中的Limit参数引起的:当设置Limit参数时,DynamoDB会获取最多这么多条记录,然后应用过滤条件。

下面文档部分中的第一个段落解释了这种行为: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.Limit

据我所知,要使用Java按页分割结果,你需要实现自己的客户端代码。

另一方面,Python Boto3 SDK提供了可用于执行此用例的分页器: https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Paginator.Scan

祝好,

Massimiliano

profile picture
专家
已回答 1 年前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则